Quand j’essaie de courir ./script.sh
j’ai eu Permission denied
mais quand j’ai couru, bash script.sh
tout va bien.
Qu'ai-je fait de mal?
Quand j’essaie de courir ./script.sh
j’ai eu Permission denied
mais quand j’ai couru, bash script.sh
tout va bien.
Qu'ai-je fait de mal?
Réponses:
Cela signifie que vous n'avez pas le bit d'autorisation d'exécution défini pour script.sh
. Lors de l'exécution bash script.sh
, vous devez uniquement disposer d'une autorisation de lecture pour script.sh
. Voir Quelle est la différence entre exécuter «bash script.sh» et «./script.sh»? pour plus d'informations.
Vous pouvez le vérifier en exécutant ls -l script.sh
.
Vous n'aurez peut-être même pas besoin de démarrer un nouveau processus Bash. Dans de nombreux cas, vous pouvez simplement exécuter source script.sh
ou . script.sh
exécuter les commandes de script dans votre shell interactif actuel. Vous voudrez probablement démarrer un nouveau processus Bash si le script modifie le répertoire en cours ou modifie l'environnement du processus en cours.
Si les bits d'autorisation POSIX sont correctement définis, la liste de contrôle d'accès (ACL) peut avoir été configurée pour vous empêcher, vous ou votre groupe, d'exécuter le fichier. Par exemple, les autorisations POSIX indiqueraient que le script de shell de test est exécutable.
$ ls -l t.sh
-rwxrwxrwx+ 1 root root 22 May 14 15:30 t.sh
Cependant, si vous tentez d'exécuter le fichier, vous obtenez:
$ ./t.sh
bash: ./t.sh: Permission denied
La getfacl
commande montre la raison pour laquelle:
$ getfacl t.sh
# file: t.sh
# owner: root
# group: root
user::rwx
group::r--
group:domain\040users:rw-
mask::rwx
other::rwx
Dans ce cas, mon groupe principal est celui pour domain users
lequel les autorisations d'exécution ont été révoquées en limitant la liste de contrôle d'accès avec sudo setfacl -m 'g:domain\040users:rw-' t.sh
. Cette restriction peut être levée par l’une des commandes suivantes:
sudo setfacl -m 'g:domain\040users:rwx' t.sh
sudo setfacl -b t.sh
Voir:
Enfin, dans ce cas spécifique, la raison pour laquelle vous ne pouvez pas exécuter le script est que le système de fichiers sur lequel réside le script a été monté avec l' noexec
option. Cette option annule les autorisations POSIX pour empêcher tout fichier sur ce système de fichiers d'être exécuté.
Cela peut être vérifié en exécutant la mount
liste de tous les systèmes de fichiers montés; les options de montage sont listées entre parenthèses dans l'entrée correspondant au système de fichiers, par exemple
/dev/sda3 on /tmp type ext3 (rw,noexec)
Vous pouvez déplacer le script vers un autre système de fichiers monté ou remonter le système de fichiers en permettant son exécution:
sudo mount -o remount,exec /dev/sda3 /tmp
Remarque: je l’utilise /tmp
comme exemple ici car il existe de bonnes raisons de sécurité pour garder /tmp
monté avec le noexec,nodev,nosuid
jeu d’options.
Essayer
chmod 755 script.sh
cela rendra le fichier exécutable. Alors essaye,
./script.sh
J'espère que cela fonctionnera.
Sur mon win7 avec admin en cours d'exécution cmd; J'ai des fichiers .sh associés à cygwin64 / bin / bash, mais ils ont été bloqués par cmd. Aucune des suggestions ci-dessus n'a aidé (chmod, setfacl, mount).
La solution ci-dessous a bien fonctionné, c’est un logiciel de gestion de fichier acl-fixateur lorsque les dossiers / fichiers deviennent inaccessibles à l’administrateur sur win7, ce qui est souvent le cas):
Start > run cmd as Admin
c:\> script.sh
Access is denied.
cmd> chmod 0777 script.sh c:\cygwin64\bin\bash.exe
cmd> script.sh
Access is denied.
> assoc .sh
.sh=bash
> ftype bash
bash=C:\cygwin64\bin\bash.exe -- "%1" %*
> bash
$ FILE=c:/cygwin64/bin/bash.exe
$ FILE=${FILE////\\} # s,/,\,g
# Compare these permissions using accesschk by Mark Russinovich 2015
$ accesschk.exe -lq $FILE
$ accesschk.exe -lq c:/windows/system32/cmd.exe
# [large output not shown]
# === Solution: Change windows acl for bash ===
$ takeown /F $FILE /A > /dev/null
$ icacls $FILE /t /q /c /reset
$ icacls $FILE /t /q /c /grant :r Everyone:F
$ icacls $FILE /t /q /c /setowner Administrators
# ====
cmd> script.sh
OK .. invokes bash
getfacl script.sh
?