Avec Bash, source
il est possible d'exécuter un script sans définir un bit d'exécution. Ceci est documenté et le comportement attendu, mais n'est-ce pas contre l'utilisation d'un bit d'exécution?
Je sais que source
cela ne crée pas de sous-shell.
bash
permissions
executable
source
conventions
Motte001
la source
la source
chmod
vous puissiez définir des autorisations (y compris `x) avec un nombre octal donne une idée de son époque. Je ne serais pas surpris si cela commençait par un indicateur rapide et sale "il s'agit d'un fichier binaire que vous pouvez exécuter", à partir des jours précédant son invention, mais je n'ai aucune preuve de celacp /sbin/suidexecutable /tmp/mycopy; /tmp/mycopy
Réponses:
Bash est un interprète. il accepte les entrées et fait ce qu'il veut. Il n'est pas nécessaire de tenir compte du bit exécutable. En fait, Bash est portable et peut fonctionner sur des systèmes d'exploitation et des systèmes de fichiers dépourvus de tout concept de bit exécutable.
Ce qui importe dans l’exécutable, c’est le noyau du système d’exploitation. Lorsque le noyau Linux effectue
exec
, par exemple, qu'il vérifie que le système de fichiers n'est pas monté avec unenoexec
option, il vérifie le bit exécutable du fichier programme et applique toutes les exigences imposées par les modules de sécurité (tels que SELinux ou AppArmor).Notez que le bit exécutable est un type de contrôle plutôt discrétionnaire. Sur un système Linux x86-64, par exemple, vous pouvez ignorer la vérification du bit exécutable par le noyau en appelant explicitement en
/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
tant qu'interpréteur :Cela ressemble un peu à la recherche du code source Bash dans Bash, à l'exception de
ld.so
l'interpréteur et du code qu'il exécute est un code machine au format ELF.la source
ld.so
est de faire des liens dynamiques.source
ou l'équivalent , mais la norme dot.
ne pas exécuter le script, mais lisez les commandes à partir du fichier de script, puis les exécuter, ligne par ligne, dans un environnement shell actuel.Il n'y a rien contre l'utilisation du bit d'exécution, car le shell ne doit lire l' autorisation de lire le contenu du fichier.
Le bit d'exécution n'est requis que lorsque vous exécutez le script. Ici, le shell procédera à un
fork()
nouveau processus, puis utiliseraexecve()
function pour créer une nouvelle image de processus à partir du script, qui doit être un fichier exécutable standard.la source
bash < script
, vous obtenez essentiellement le même résultat quesource script
. Quelle protection une vérification de bit d'exécution fournit-elle?execv
famille de systèmes d'appels OS * peut être utilisée avec un exécutable et non si un interprète l'exécutera. Pourquoi confondre les gens (et rompre la capacité d'évaluer le code transmis à partir de sources non-fichiers) en rompant les conventions?bin/activate
n'a donc pas de bit exécutable. Les scripts peuvent être totalement des bibliothèques ou d'autres choses comme ça. J'imagine qu'avoir .sh pourrait également être un signal, mais il est bon d'avoir un minimum de pistolets à pied: c'est bien qu'il ne soit pas possible de courir./bin/activate
par accident au lieu de. bin/activate
Le bit exécutable (contrairement au reste) sur les fichiers non-setuid et non-setguid n'est pas vraiment un mécanisme de sécurité. Tout ce que vous pouvez lire peut être exécuté indirectement, et Linux vous permettra de lire indirectement tout ce que vous pouvez exécuter, mais pas directement (cela devrait suffire à percer un trou dans le concept de non-set (g) uid x-bit étant un mesure de sécurité).
C’est plus une question de commodité: laissez le système l’exécuter pour moi directement si le bit est défini, sinon je dois le faire indirectement (
bash the_script;
ou un peu de piratage informatique pour obtenir l’image mémoire d’un exécutable sans autorisation de lecture ).Vous pouvez le configurer pour plus de commodité si vous avez l’intention d’intégrer le code source et d’exécuter votre code source unique.
Apparemment, cependant, de nombreux développeurs de bibliothèques partagées partagent votre pensée et par conséquent, de nombreux systèmes exigent que les bibliothèques partagées, qui sont essentiellement l'équivalent natif des commandes à sous shell, soient marquées comme exécutables pour pouvoir être utilisées. Voir Pourquoi les bibliothèques partagées sont-elles exécutables? .
la source
chmod
le créer et de le rendre exécutable. C'est pour trier les données des programmes, la question du PO est donc raisonnable.x
bit est juste un endroit supplémentaire où il peut lire / écrire un soupçon de quoi faire./tmp$ cp /bin/cat ./cat ; chmod a-rw ./cat ; ./cat & cp /proc/$!/exe /tmp/cat2
->cp: cannot stat ‘/proc/16260/exe’: Permission denied
C'est une bonne question! Unix utilise le bit exécutable pour distinguer les programmes des données. Le système d'exploitation n'a pas besoin du bit d'exécution, puisqu'un script source n'est pas transmis au système d'exploitation pour exécution en tant que nouveau processus. Mais le shell considère un script source comme un programme et recherchera
$PATH
le fichier que vous souhaitez créer. Ainsi, le shell lui-même aurait pu nécessiter une autorisation d'exécution pour les fichiers sourcés; mais ça n'a pas été le cas.La question doit avoir été posée il y a longtemps. La conception du shell Bourne est le résultat d' une "longue séquence de modifications, dialogues, discussions" entre les habitants des Bell Labs, et de nombreuses décisions de conception ont été discutées par SR Bourne et d'autres au fil des ans. Malheureusement, mon rapide coup d'oeil n'a trouvé aucune discussion sur la fonctionnalité source (pour ma défense, il est difficile de chercher sur Google). Ce que j'ai trouvé, c'est que le "." La commande n'apparaît pas dans cette première introduction au shell par Bourne lui-même, mais elle est présente dans la version plus mature de la version 7 .
En l'absence d'autorité, voici ma propre interprétation:
La
.
commande, à savoirsource
, est en fait une inclusion textuelle (comme#include
dans le préprocesseur C) dans le code source du script en cours d'exécution ou de la session interactive. En tant que tel, le fichier inclus n'est sans doute pas "exécuté".La philosophie Unix a toujours été de donner aux programmeurs assez de corde pour se pendre. Trop de restrictions manuelles et arbitraires font obstacle. Ce n’est que récemment que certaines distributions effectuées
rm -r /
refusent de faire ce que vous demandez. (Cette commande ditrm
de tout supprimer sur votre ordinateur. N'essayez pas en tant que root! Ou mieux encore, pas du tout.) Alors, peut-être que Bourne est al. vient de décider que lorsque vous essayez de créer un fichier, vous êtes censé savoir ce que vous faites. Cela évite également des travaux inutiles et les cycles comptaient beaucoup à l'époque.la source
En ce qui concerne le système d'exploitation, un fichier contenant un script shell est simplement une donnée. Si vous transmettez le nom d'un tel fichier de données à la
source
commande ou le transmettez sur la ligne de commande à un appel du shell bash, tout ce que le système d'exploitation voit est une chaîne qui coïncide avec le nom d'un fichier contenant des données.Quelle serait la pertinence du bit d'exécution dans ce cas?
la source
La distinction est importante car vous pouvez avoir un fichier de commandes shell qui n’est pas utile comme exécutable, mais seulement lorsqu’il est généré. Pour ce fichier, vous pouvez désactiver le bit d’exécution et il ne sera jamais utilisé à moins d’être explicitement utilisé dans une commande source. La raison d'une telle chose est d'avoir des effets secondaires sur la coquille à partir de laquelle il est exécuté. Pour un exemple spécifique, j'ai un script appelé fix_path qui examine et modifie le chemin.
la source
Juste au cas où quelqu'un serait intéressé par d'autres études et / ou précisions: Dans un shell conforme à POSIX et implémenté il y a quelque temps, le fonctionnement interne des fonctions 'exec_program ()' et 'builtin_source ()' est très exemplaire. Dans ces fonctions, vous voyez exactement quelle est la différence entre elles:
https://github.com/rsenn/shish/blob/master/src/builtin/builtin_source.c
https://github.com/rsenn/shish/blob/master/src/exec/exec_program.c
en gros, le sourcing peut être vu comme le shell redirigeant temporairement son descripteur de fichier interne où il analyse le script du shell depuis (le terminal en mode interactif). il est donc très similaire aux autres redirections telles que
<input_file.txt
et>>append_to_something.list
et celles-ci doivent simplement ouvrir et fermer des fichiers.l'exécution est donc gérée par l'
execve()
appel système pour lequel le bit d'exécution est obligatoire.Je me souviens d’avoir vu certains systèmes autorisant l’exécution de fichiers binaires ELF / a.out, mais en exécutant le "/lib/ld-dynamic-linker.so" et avec le programme binaire (sans le bit d’exécution) comme premier argument. Je crois que c’était sur certaines machines DEC Alpha ou VAX (est-ce que c’était SCO Unix?)
la source
Un autre point de vue:
Le script sourced consiste essentiellement en des commandes intégrées au shell et des appels de programme. Shell intégré (avec
source
parmi eux) sont des parties du shell et le shell doit être exécutable en premier lieu. Chaque programme appelé (ELF, un autre script avec shebang, peu importe) doit avoir un bit d’exécution défini, sinon il ne fonctionnera pas.Donc, ce n’est pas contre l’utilisation d’un bit d’exécution, car rien ne sera exécuté sans bit d’exécution. La validation ne se produit pas pour le script source dans son ensemble; il est exécuté pour chaque partie séparément, mais c'est le cas.
la source