web-dev-qa-db-fra.com

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

Lorsque j'essaie d'exécuter ./script.sh J'ai eu Permission denied mais quand je lance bash script.sh tout va bien.

Qu'ai-je fait de mal?

49
Piotr Stapp

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 avez seulement besoin d'une autorisation de lecture pour script.sh. Voir Quelle est la différence entre l'exécution de "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 pour 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 autrement l'environnement du processus en cours.

Listes de contrôle d'accès

Si les bits d'autorisation POSIX sont définis correctement, 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 Shell de test est exécutable.

$ ls -l t.sh
-rwxrwxrwx+ 1 root root 22 May 14 15:30 t.sh

Cependant, la tentative d'exécution du fichier entraîne:

$ ./t.sh
bash: ./t.sh: Permission denied

La commande getfacl 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 domain users dont les autorisations d'exécution ont été révoquées en restreignant l'ACL 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, la raison dans ce cas spécifique de ne pas pouvoir exécuter le script est que le système de fichiers sur lequel le script réside a été monté avec l'option noexec. Cette option remplace les autorisations POSIX pour empêcher l'exécution de tout fichier sur ce système de fichiers.

Ceci peut être vérifié en exécutant mount pour lister tous les systèmes de fichiers montés; les options de montage sont répertoriées entre parenthèses dans l'entrée correspondant au système de fichiers, par ex.

/dev/sda3 on /tmp type ext3 (rw,noexec)

Vous pouvez soit déplacer le script vers un autre système de fichiers monté ou remonter le système de fichiers permettant l'exécution:

Sudo mount -o remount,exec /dev/sda3 /tmp

Remarque: j'ai utilisé /tmp comme exemple ici car il y a bonnes raisons de sécurité pour conserver /tmp monté avec le noexec,nodev,nosuid ensemble d'options.

52

Essayer

chmod +rx script.sh

cela rendra le fichier exécutable. Alors essaye,

./script.sh

J'espère que cela fonctionnera.

35
ranga.sl

Sur mon win7 avec admin exécutant cmd; J'ai des fichiers .sh associés à cygwin64/bin/bash, mais il a été bloqué par cmd. Aucune des suggestions ci-dessus n'a aidé (chmod, setfacl, mount).

La solution ci-dessous a fonctionné, il s'agit d'un fixateur d'administration de marteau de traîneau à chaque fois que les dossiers/fichiers deviennent inaccessibles à l'administrateur sur win7, ce qui est souvent):

  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
1
mosh