Commande introuvable lors de l'utilisation de sudo
j'ai un script appelé foo.sh
dans mon dossier personnel.
quand je navigue vers ce dossier, et que j'entre ./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 arrive-t-il et comment je peux le réparer?
8 réponses
Permission refusée
pour exécuter un script, le fichier doit avoir un bit de permission exécutable .
afin de bien comprendre Linux permissions de fichiers vous pouvez étudier la documentation pour la commande chmod
. chmod , une abréviation de change mode , est la commande qui est utilisée pour modifier les paramètres d'autorisation d'un fichier.
pour lire la documentation chmod de votre système local , Lancez man chmod
ou info chmod
depuis la ligne de commande. Une fois lu et compris, vous devriez être capable de comprendre la sortie de l'exécution ...
ls -l foo.sh
... qui listera les permissions 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 de permission est parfois appelé "monde" ou "autre")
voici un résumé de la façon de résoudre le Permission refusée erreur 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 lu et écrit l'accès rw mais le - indique que la permission exécutable est manquante
la commande chmod
corrige cela. (Groupe et autres ont seulement la permission de lecture définie sur le dossier, ils ne peut pas lui é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 en ce qui concerne Linux.
à l'Aide de sudo résultats dans la Commande introuvable
lorsque vous exécutez une commande en utilisant sudo vous l'exécutez effectivement en tant que super-utilisateur ou root.
la raison pour laquelle l'utilisateur root ne trouve pas votre commande est probable que le PATH
la variable d'environnement pour root n'inclut pas le répertoire où foo.sh
est situé . D'où la commande n'est 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'il est prévu d'exécuter
env | grep ^PATH
voici un exemple de sortie d'exécution de la commande env
ci-dessus d'abord comme un utilisateur ordinaire, puis comme utilisateur root 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 chemin l'utilisateur non privilégié (rkielty) et le super utilisateur sont pas le même .
le répertoire où foo.sh
réside n'est pas présent dans la variable chemin de l'utilisateur racine, d'où la commande erreur non trouvée .
les autres solutions que j'ai vues jusqu'ici sont basées sur certaines définitions de système, mais il est en fait possible d'avoir sudo
utiliser le courant PATH
(avec la commande env
) et/ou le reste de l'environnement (avec l'option -E
) simplement en l'invoquant correctement:
sudo -E env "PATH=$PATH" <command> [arguments]
En fait, on peut faire un alias:
alias mysudo='sudo -E env "PATH=$PATH"'
(il est également possible de nommer l'alias lui-même sudo
, remplaçant le original sudo
.)
Vérifier secure_path 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 dépassé utiliser visudo
et éditer /etc/sudoers
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
- vérifiez que vous avez la permission d'exécuter sur le script. c'est-à-dire
chmod +x foo.sh
- vérifiez que la première ligne de ce script est
#!/bin/sh
ou un tel. - Pour sudo vous êtes dans le mauvais répertoire. contrôle avec
sudo pwd
vous pouvez également créer un lien vers votre script dans l'un des répertoires ( /usr/local/bin
par exemple) du Super user PATH. Il sera alors disponible pour le sudo.
chmod +x foo.sh
sudo ln -s path-to-foo.sh /usr/local/bin/foo
regarder cette réponse pour avoir une idée de l'annuaire de mettre des liens symboliques.
il semble que linux va dire" commande introuvable " même si vous donnez explicitement le chemin du fichier.
[veeam@jsandbox ~]$ sudo /tmp/uid.sh;echo $?
sudo: /tmp/uid.sh: command not found
1
[veeam@jsandbox ~]$ chmod +x /tmp/uid.sh
[veeam@jsandbox ~]$ sudo /tmp/uid.sh;echo $?
0
c'est une erreur quelque peu trompeuse, mais elle est probablement techniquement correcte. Un fichier n'est pas une commande tant que son exécutable n'est pas trouvé.
Ok c'est ma solution: dans./~ bash_aliases ajoute simplement ce qui suit:
# ADDS MY PATH WHEN SET AS ROOT
if [ $(id -u) = "0" ]; then
export PATH=$PATH:/home/your_user/bin
fi
voilà! Vous pouvez maintenant exécuter vos propres scripts avec sudo ou avec ROOT sans avoir à exporter PATH=$PATH:/home/your_user/bin à chaque fois.
noter que je dois être explicite lors de l'ajout de mon chemin depuis la maison pour superuser est / root
essayez chmod u+x foo.sh
au lieu de chmod +x foo.sh
si vous avez des problèmes avec les guides ci-dessus. Cela a fonctionné pour moi quand les autres solutions n'ont pas.