J'ai créé un script Bash qui fait écho "Hello World". J'ai également créé un utilisateur de test, Bob, en utilisant adduser
.
Personne n'a la permission d'exécuter ce fichier comme indiqué par ls
:
$ ls -l hello.sh
-rw-r--r-- 1 george george 19 Mai 29 13:06 hello.sh
Comme nous pouvons le voir de ce qui précède, le propriétaire du fichier est George où il n'a que lire et écrire un accès mais aucun accès exécuté. Mais connecté comme George Je suis capable d'exécuter directement le script:
$ . hello.sh
Hello World
Pour aggraver les choses, je me connecte comme Bob, où je n'ai que la permission, mais je suis toujours en mesure d'exécuter le fichier:
$ su bob
Password:
$ . /home/george/testdir/hello.sh
Hello World
Ce qui se passe?
Dans vos exemples, vous n'exécutez pas les fichiers, mais Sourcing eux.
L'exécution serait via
$ ./hello.sh
et pour cela, une autorisation d'exécution est nécessaire. Dans ce cas, une sous-shell est ouverte dans laquelle les commandes du fichier de script sont exécutées.
Sourcing, c'est-à-dire.
$ . hello.sh
(avec un espace entre les deux) seulement Lit Le fichier et la coquille à partir de laquelle vous avez appelé le . hello.sh
Commande Exécute ensuite les commandes directement en lecture, c'est-à-dire sans ouvrir une sous-coquille. Comme le fichier est uniquement lu, l'autorisation de lecture est suffisante pour l'opération. ( Notez également que indiquer le nom de fichier de script comme celui invoque une recherche PATH
, donc s'il y a un autre hello.sh
Dans votre PATH
que sera acheté! Utilisez des chemins explicites, comme dans . ./hello.sh
Pour vous assurer de la source "la bonne".)
Si vous souhaitez empêcher cela de se produire, vous devez également supprimer la permission de lecture, pour tout utilisateur qui n'est pas censé utiliser le script. C'est raisonnable de toute façon Si vous êtes vraiment préoccupé par l'utilisation non autorisée du script, car
sh ./hello.sh
à la place de./hello.sh
[.____] Parce que cela ne nécessite également que des autorisations de lecture sur le fichier de script (voir cette réponse E.G.).en tant que note générale , gardez à l'esprit qu'il existe des différences subtiles entre l'approbation et l'exécution d'un script (voir cette question par exemple) .
L'autorisation d'exécution signifie simplement que ce fichier peut être exécuté. Cependant, lorsque vous le souhaitez (. hello.sh
ou source hello.sh
) ou lorsque vous le transmettez comme une dispute à un interprète Shell (sh hello.sh
), vous n'exécutez pas le fichier, vous exécutez une autre commande (.
ou sh
) et transmettre le fichier sous forme d'argument à cette commande.
Donc, pour répondre à votre question, la raison pour laquelle vous pouvez "exécuter" le fichier avec . hello.sh
est la même raison pour laquelle vous pouvez courir cat hello.sh
: vous êtes juste -lecture le fichier, pas l'exécuter.
Pour illustrer:
$ ls -l
total 4.0K
-r--r--r-- 1 terdon terdon 21 May 29 12:29 foo.sh
$ cat ./foo.sh
#!/bin/sh
echo Hello
$ ./foo.sh
bash: ./foo.sh: Permission denied
$ sh ./foo.sh
Hello
Comme vous pouvez le constater, je ne peux pas réellement exécuter le script, mais je peux le lire - soit avec cat
ou avec .
-parfaitement bien.
La version très courte est la suivante: vous n'êtes pas exécution le fichier. Vous êtes Lecture le dans la coquille, qui l'exécute ensuite.
Notez que certains Interprètes de langue Vérifiez que les autorisations d'exécution d'un fichier à exécuter et refuseront de le faire si l'utilisateur n'a pas d'autorisation appropriée. Mais c'est une vérification totalement discrétionnaire par l'auteur de cet interprète particulier et n'est pas appliqué par le système d'exploitation.
Faisons une petite expérience de pensée.
Je pense que nous pouvons tous les deux d'accord, cela si Un programme a des autorisations exécutables, je devrais être autorisé à exécuter ce programme. Je pense que nous pouvons également convenir que ce programme devrait être autorisé à imprimer la chaîne "Hello World" à la console.
En outre, nous pouvons probablement aussi convenir qu'un programme devrait pouvoir lire un fichier tant que ce fichier a lu des autorisations de lecture. Et peu importe ce que le contenu de ce fichier est, tant que le fichier dispose du jeu de bits d'autorisation de lecture, le programme doit être autorisé à le lire.
D'accord, comme nous avons convenu que le programme devrait être autorisé à imprimer "Hello World" à la console et nous avons convenu que le programme devrait être autorisé à lire le dossier, vous devez également accepter logiquement que le programme devrait être autorisé à Lire le fichier -et Imprimer "Hello World" à la console. Et nous avons également déclaré que le programme est autorisé ou non à lire le fichier dépend des autorisations, et non sur le contenu, il convient également de lire le fichier et d'imprimer "Hello World" à la console si le contenu du fichier est echo Hello World
.
Maintenant, pouvez-vous également convenir que, étant donné que le programme est autorisé à lire le fichier et que le programme est autorisé à imprimer "Hello World" à la console, qu'il est également autorisé à vérifier le contenu du fichier et seulement Imprimer "Hello World" à la console si le contenu du fichier est echo Hello World
?
Eh bien, mais alors c'est est "Interprétation", en d'autres termes exécution Le fichier, et vous venez d'accord avec moi à chaque étape de la manière dont il devrait être autorisé à Faites ça!
Et c'est exactement ce qui se passe ici. La shell lit simplement lire un fichier texte, qu'il est autorisé à faire car le fichier texte a lu des autorisations. Et la coquille exécute les instructions du fichier texte, qu'il est autorisé à faire car la coquille a exécuté des autorisations.