Réponses:
Supposons que vous ayez le fichier myscript
contenant 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.
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.sh
et 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".
bash
) pour effectuer l'exécution - pour bloquer que vous devrez également retirer leur read
autorisation.
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 basis
Mais 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?
sudo chmod g+x myfile.sh
dans 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 .
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.
L' exec
appel système du noyau Linux échoue EACCES
si 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.sh
ne peut pas fonctionner, car lorsque vous faites cela:
exec
appel système./myprog.sh
exec
appel système du noyau Linux comme expliqué sur: /programming/2429511/why-do-people-write-the-usr-bin-env-python-shebang-on -la-première-ligne-d'un-pyt / 40938801 # 40938801Cela 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.sh
n'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