219 votes

Commande non trouvée lors de l'utilisation de sudo

J'ai un script appelé foo.sh dans mon dossier personnel.

Lorsque je navigue dans ce dossier, et que je saisis ./foo.sh j'obtiens

-bash: ./foo.sh: Permission denied .

Quand j'utilise sudo ./foo.sh j'obtiens

sudo: foo.sh: command not found .

Pourquoi cela se produit-il et comment puis-je y remédier ?

205voto

Rob Kielty Points 3274

Permission refusée

Afin d'exécuter un script le fichier doit avoir un bit de permission exécutable activé .

Afin de bien comprendre Linux autorisations de fichiers vous pouvez étudier la documentation relative au chmod commandement. chmod , une abréviation de mode de changement est la commande qui est utilisée pour modifier les paramètres de permission d'un fichier.

Pour lire la documentation chmod pour votre système local, exécutez man chmod ou info chmod à partir de la ligne de commande. Une fois lu et compris, vous devriez être en mesure de comprendre le résultat de l'exécution ...

ls -l foo.sh

... qui donnera la liste des autorisations de LECTURE, d'ÉCRITURE et d'EXÉCUTION pour le propriétaire du fichier, le propriétaire du groupe et toute autre personne qui n'est pas le propriétaire du fichier ou un membre du groupe auquel le fichier appartient (ce dernier groupe d'autorisation est parfois appelé "monde" ou "autre").

Voici un résumé de la manière de dépanner le Erreur "Permission refusée dans votre cas.

$ ls -l foo.sh                    # Check file permissions of foo
-rw-r--r-- 1 rkielty users 0 2012-10-21 14:47 foo.sh 
    ^^^ 
 ^^^ | ^^^   ^^^^^^^ ^^^^^
  |  |  |       |       | 
Owner| World    |       |
     |          |    Name of
   Group        |     Group
             Name of 
              Owner 

Le propriétaire a un accès en lecture et en écriture rw mais le - indique que l'autorisation d'exécution est manquante.

Le site chmod corrige ce problème. (Les groupes et autres n'ont que la permission de lire le fichier, ils ne peuvent pas y écrire ou l'exécuter).

$ chmod +x foo.sh               # The owner can set the executable permission on foo.sh
$ ls -l foo.sh                  # Now we see an x after the rw 
-rwxr-xr-x 1 rkielty users 0 2012-10-21 14:47 foo.sh
   ^  ^  ^

foo.sh est maintenant exécutable pour ce qui est de Linux.

L'utilisation de sudo donne comme résultat Command not found

Lorsque vous exécutez une commande en utilisant sudo vous l'exécutez effectivement en tant que superutilisateur ou Root.

La raison pour laquelle l'utilisateur Root ne trouve pas votre commande est probablement que le fichier PATH pour Root ne comprend pas la variable d'environnement foo.sh est situé . La commande n'est donc pas trouvée.

La variable d'environnement PATH contient une liste de répertoires qui sont recherchés pour les commandes. Chaque utilisateur définit sa propre variable PATH en fonction de ses besoins. Pour voir ce qu'elle contient, exécutez

env | grep ^PATH

Voici quelques exemples de résultats de l'exécution de la commande ci-dessus. env d'abord en tant qu'utilisateur ordinaire et ensuite en tant qu'utilisateur racine en utilisant sudo

rkielty@rkielty-laptop:~$ env | grep ^PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

rkielty@rkielty-laptop:~$ sudo env | grep ^PATH
[sudo] password for rkielty: 
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

Notez que, bien que similaires, dans ce cas les répertoires contenus dans le PATH de l'utilisateur non-privilégié (rkielty) et du super utilisateur sont pas la même chose .

Le répertoire dans lequel foo.sh n'est pas présent dans la variable PATH de l'utilisateur Root, d'où l'utilisation de la commande commande non trouvée erreur.

0 votes

Bizarre que sudo $PWD/temp.sh ne fonctionne pas non plus, tandis que sudo echo $PWD montre juste ce que j'attendais. (Mac)

1 votes

@Nakilon si vous mettez cela dans une question avec tous les détails, je devrais être en mesure de résoudre le problème pour vous. Le problème est probablement de savoir quel shell (votre premier shell de commande ou le shell lancé par sudo) a évalué $PWD

0 votes

@RobKielty, ça ne fait rien. Je ne me souviens pas du problème exact, mais il s'agissait probablement de quelque chose comme le fait de ne pas définir chmod -x pour une commande dans script, et l'appel de script via sudo générait un message d'erreur pas très compréhensible.

168voto

Tom Points 802

Les autres solutions que j'ai vues ici jusqu'à présent sont basées sur des définitions de système, mais il est en fait possible d'avoir sudo utiliser l'actuel PATH (avec le env ) et/ou le reste de l'environnement (avec la commande -E ) simplement en l'invoquant correctement :

sudo -E env "PATH=$PATH" <command> [arguments]

En fait, on peut en faire un alias :

alias mysudo='sudo -E env "PATH=$PATH"'

(Il est également possible de nommer l'alias lui-même. sudo en remplacement de l'original sudo .)

33voto

Spero.ShiroPetto Points 863

Vérifiez si chemin sécurisé sur sudo

[root@host ~]# sudo -V | grep 'Value to override'
Value to override user's $PATH with: /sbin:/bin:/usr/sbin:/usr/bin

Si $PATH est remplacée par l'utilisation visudo et modifier /etc/sudoers

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin

0 votes

Merci ! Cela a aidé à résoudre le mystère de sudo qui ne pouvait pas exécuter de commandes.

0 votes

Vous n'expliquez pas pourquoi ils sont différents en premier lieu.

0 votes

@PhilipRego - Ces réponses ont +6 ans, Si vous estimez qu'il n'y a pas assez de détails sur plusieurs réponses... Essayez d'offrir quelques suggestions sur ce que vous recherchez, ou mieux encore, éditez la réponse pour fournir les détails que vous trouvez manquants.

8voto

Ed Heal Points 24309
  1. Vérifiez que vous avez la permission d'exécuter sur le script, c'est-à-dire. chmod +x foo.sh
  2. Vérifiez que la première ligne de ce script est #!/bin/sh ou autre.
  3. Pour sudo vous êtes dans le mauvais répertoire. vérifiez avec sudo pwd

6voto

TrigonaMin Points 1

Vous pouvez également créer un lien logiciel vers votre script dans l'un des répertoires ( /usr/local/bin par exemple) dans le PATH du super utilisateur. Il sera alors disponible pour le sudo.

chmod +x foo.sh
sudo ln -s path-to-foo.sh /usr/local/bin/foo

Jetez un coup d'œil à cette réponse pour avoir une idée de l'annuaire dans lequel placer un lien souple.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X