Exécuter ./script.sh vs bash script.sh - autorisation refusée

44

Quand j’essaie de courir ./script.shj’ai eu Permission deniedmais quand j’ai couru, bash script.shtout va bien.

Qu'ai-je fait de mal?

Piotr Stapp
la source
Pouvez-vous éditer la question pour inclure le contenu de la ligne shebang ainsi que la sortie de getfacl script.sh?
Anthony G - justice pour Monica

Réponses:

50

Autorisations POSIX incorrectes

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.shou . script.shexé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.

Listes de contrôle d'accès

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 getfaclcommande 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 userslequel 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:

Système de fichiers monté avec l'option noexec

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' noexecoption. 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 mountliste 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 /tmpcomme exemple ici car il existe de bonnes raisons de sécurité pour garder /tmpmonté avec le noexec,nodev,nosuidjeu d’options.

Anthony G - justice pour Monica
la source
2
J'ai mis chmod 777 et ai toujours cette erreur.
Piotr Stapp
2
Je n'ai eu aucun exec sur la partition.
Piotr Stapp
donc je n'ai pas d'exécutif et ce n'est pas répertorié dans fstab. pourquoi diable fait-il cela à mes partitions non-tmp que j'ai?
Deryck
2
C’était cette option noexec dans / etc / fstab.
user208145
Je voudrais ajouter qu’il est également sage de vérifier si le dossier contenant le script est "exécutable" ou non (donc il a le drapeau X ou non). Si ce n'est pas le cas, le script ne sera exécutable que par l'utilisateur root.
Letokteren
30

Essayer

chmod 755 script.sh

cela rendra le fichier exécutable. Alors essaye,

./script.sh

J'espère que cela fonctionnera.

ranga.sl
la source
2
Iwelcomme to U & L, je reformate selon les conventions, cependant cela n’ajoute presque rien à la réponse précédente.
Archemar
8
parfois, la réponse la plus courte est la meilleure :)
Sameera Kumarasingha
1

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
mosh
la source