Les scripts peuvent-ils s'exécuter même s'ils ne sont pas définis comme exécutables?

25

Je peux sembler exécuter des scripts (.sh) avec et sans qu'ils soient définis comme exécutables. Alors, où cela est-il important?

Ashfame
la source

Réponses:

24

Supposons que vous ayez le fichier myscriptcontenant les éléments suivants:

#!/bin/bash
echo "Hello, World!"

Si vous rendez ce fichier exécutable et que vous l'exécutez avec ./myscript, le noyau verra que les deux premiers octets le sont #!, ce qui signifie que c'est un fichier de script. Le noyau utilisera alors le reste de la ligne comme interpréteur et passera le fichier comme premier argument. Donc, ça tourne:

/bin/bash myscript

et bash lit le fichier et exécute les commandes qu'il contient.

Ainsi, pour que bash (ou tout autre interpréteur requis par votre script) "exécute" le script, il doit seulement pouvoir lire le fichier.

Donc, pour les scripts, le bit d'exécution le rend un peu plus pratique à exécuter. Tant que bash est exécutable, vous pouvez toujours exécuter bash avec le fichier de script comme argument, ou exécuter bash de manière interactive et copier coller le script ligne par ligne dans votre terminal pour exécuter les commandes.

geirha
la source
Merci d'avoir expliqué en détail. :) Si j'ai bien compris, tout utilisateur accédant à bash a juste besoin d'un accès en lecture au script pour l'exécuter car bash prendra le script en entrée et n'aura besoin que de le lire. Je peux arrêter ce comportement en prenant l'autorisation de lecture du script pour cet utilisateur. Droite? Alors, quand est-ce que cette autorisation exécutable est utilisée et exactement?
Ashfame
Oui, si vous utilisez "bash myscript", l'utilisateur n'a besoin que d'un accès en lecture pour "myscript" (et bien sûr exécutable pour / bin / bash si bash est là dans le chemin). Cependant, si vous rendez votre script exécutable, les choses sont un peu différentes. Il est vrai que du point de vue du noyau, ce sera à nouveau "/ bin / bash myscript" si la première ligne est #! / Bin / bash, mais pour y parvenir, vous devez d'abord présenter le script comme exécutable pour le utilisateur ou groupe. Cependant, c'est vrai si pour certains utilisateurs le script n'est pas exécutable mais lisible, il peut toujours "exécuter" le script avec "bash myscript" ....
LGB
@LGB C'est donc à peu près inutile. La bonne chose est de couper l'autorisation de lecture à un utilisateur pour ce script. Droite?
Ashfame
@Ashfame: Je dirais utile plutôt qu'inutile. Le bit d'exécution sur les fichiers normaux n'est pas (et n'a jamais été destiné à être) utilisé pour limiter l'accès. Il semble que vous vous attendiez à cela. Si vous avez un exécutable binaire, vous devez avoir la permission d'exécution dessus pour l'exécuter. Cependant, si vous y avez accès en lecture, vous pouvez toujours copier le fichier dans votre propre répertoire personnel, auquel cas la copie vous appartiendra, vous pouvez donc lui ajouter une autorisation d'exécution ... et l'exécuter. Cependant, pour les répertoires, son objectif est un peu différent. Voir mywiki.wooledge.org/Permissions
geirha
1
Que dois-je utiliser à la place de / bin / bash si je ne connais pas le bon interprète? Existe-t-il une commande qui exécute le script selon la ligne shebang?
Aivar
16

Assurez-vous que vous ne confondez pas "exécuter le script shell" avec "exécuter un script shell en utilisant sh".

Cela ne sera pas affecté par les autorisations de fichier sur file.sh:

sh file.sh

Vous exécutez sh(qui résout le programme /bin/sh), qui lit file.shet exécute son code.

Les autorisations sur les fichiers auront effet si vous exécutez vraiment le script lui - même :

./file.sh

Notez que les autorisations de fichiers ne sont pas prises en charge par les systèmes de fichiers non Linux, comme FAT. Ainsi, même si vous exécutez chmod -x file.sh, le fichier aura toujours ses anciennes autorisations.

L'autorisation d'exécution est appliquée par le système de fichiers. Mais les programmes peuvent également "exécuter" le code en lisant le contenu du fichier, ce qui contourne les autorisations du système de fichiers sur "exécuter".

Lekensteyn
la source
Je comprends votre point. Mais est-ce pour le groupe ou le monde ou les deux?
Ashfame
@Ashfame Si vous définissez l'autorisation exécutable, le script peut être exécuté directement par les utilisateurs qui ont cette autorisation - qu'ils l'aient sur une base de groupe, de monde ou de propriétaire. Mais même les personnes sans autorisation d'exécution peuvent l'exécuter en appelant un programme différent (comme bash) pour effectuer l'exécution - pour bloquer que vous devrez également retirer leur readautorisation.
jg-faustus
If you set the executable permission, the script can be run directly by users who have that permission - whether they have it on a group, world or owner basisMais comment l'autorisation est-elle accordée à différents utilisateurs en vérifiant l'autorisation exécutable? Et j'ai obtenu votre deuxième point. Vous voulez dire leur retirer l'autorisation de lecture du script afin qu'ils ne puissent même pas le traiter via bash. Droite?
Ashfame
@Ashfame Sur le point d'autorisation de lecture, oui. Sur la façon dont vous appelleriez quelque chose comme sudo chmod g+x myfile.shdans le terminal pour ajouter des autorisations d'exécution pour le groupe du fichier. Voir le didacticiel sur les autorisations de fichiers . Pour gérer les autorisations de plusieurs utilisateurs simultanément, vous utiliseriez des groupes, voir par exemple Gestion des groupes .
jg-faustus
ce que je voulais dire, c'est lorsque nous ajoutons l'autorisation exécutable dans l'interface graphique, puis pour qui? propriétaire / groupe / monde?
Ashfame
1

Ne pensez pas à cela de cette façon. Puis-je exécuter ce fichier? Pensez-y de la manière suivante: qui peut exécuter ce fichier?

Si l'ordinateur est à vous et que le fichier est à vous, je suis sûr que vous pouvez l'exécuter. Vous voudrez peut-être approfondir les commandes comme chmod et chown et les autorisations de fichier.

J'espère que ça aide.

myusuf3
la source
Oui je les connais. Cela signifie que je (propriétaire) peux toujours l'exécuter. Droite? Ensuite, définir un fichier comme exécutable est pour le groupe ou le monde ou les deux?
Ashfame
1

L' execappel système du noyau Linux échoue EACCESsi le fichier n'est pas exécutable

Bien que vous puissiez le faire sh myprog.sh(qui ne fait que lire les fichiers et les interprètes), essayer d'exécuter le programme ./myprog.shne peut pas fonctionner, car lorsque vous faites cela:

Cela peut être vérifié avec main.c:

#define _XOPEN_SOURCE 700
#include <errno.h>
#include <stdio.h>
#include <unistd.h>

int main(void) {
    char *argv[] = {"myprog", NULL};
    char *envp[] = {NULL};
    int ret;
    ret = execve("myprog.sh", argv, envp);
    perror("execve");
    printf("%d\n", errno);
    printf("%d\n", EACCES);
}

et myprog.sh:

#!/bin/sh
echo worked

Si myprog.shn'est pas exécutable, mainéchoue avec:

execve: Permission denied
13
13

Testé dans Ubuntu 17.10, gcc -std=c99.

POSIX 7 mentionne que:

Les fonctions exec, à l'exception de fexecve (), échoueront si:

[EACCES] L'autorisation de recherche est refusée pour un répertoire répertorié dans le préfixe de chemin d'accès du nouveau fichier image de processus, ou le nouveau fichier image de processus refuse l'autorisation d'exécution.

Des explications supplémentaires peuvent être trouvées sur: /security/66550/unix-execute-permission-can-be-easily-bypassed-is-it-superfluous-or-whats-the

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
la source