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?

114
demandé sur Rob Kielty 2012-10-21 13:01:16

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 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 .

122
répondu Rob Kielty 2013-12-07 01:57:01

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 .)

64
répondu Tom 2015-04-01 20:53:16

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
10
répondu codemonkee 2013-09-25 03:11:37
  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 un tel.
  3. Pour sudo vous êtes dans le mauvais répertoire. contrôle avec sudo pwd
6
répondu Ed Heal 2012-10-21 09:08:22

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.

2
répondu TrigonaMinima 2017-05-18 00:16:06

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é.

1
répondu Jeff MacDonald 2015-07-28 13:56:34

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

1
répondu Fernando D Jaime 2016-06-01 03:56:05

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.

1
répondu Peter David Carter 2017-07-13 15:09:37