Vérifiez secure_path sur sudo
[[email protected] ~]# sudo -V | grep 'Value to override'
Value to override user's $PATH with: /sbin:/bin:/usr/sbin:/usr/bin
Si $PATH
est remplacé, utilisez visudo
et modifiez /etc/sudoers
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
Autorisation refusée
Pour exécuter un script, le fichier doit avoir un bit d'autorisation exécutable défini .
Afin de bien comprendre les autorisations de fichiers Linux, vous pouvez étudier la documentation du chmod
commande. chmod, une abréviation de changer de mode , est la commande utilisée pour modifier les paramètres d'autorisation d'un fichier.
Pour lire la documentation chmod de votre système local, exécutez man chmod
ou info chmod
depuis la ligne de commande. Une fois lu et compris, vous devriez être capable de comprendre le résultat de l'exécution de ...
ls -l foo.sh
... qui répertorie les autorisations READ, WRITE et EXECUTE pour le propriétaire du fichier, le propriétaire du groupe et tous ceux qui ne sont pas le propriétaire du fichier ou un membre du groupe auquel appartient le fichier (ce dernier groupe d'autorisation est parfois appelé comme "monde" ou "autre")
Voici un résumé de la façon de résoudre l'erreur Autorisation 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 exécutable est manquante
Le chmod
la commande corrige cela. (Le groupe et les autres n'ont que l'autorisation de lecture définie sur le fichier, ils ne peuvent pas y écrire ni 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'utilisation de sudo entraîne la commande introuvable
Lorsque vous exécutez une commande à l'aide de 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 PATH
la variable d'environnement pour root n'inclut pas le répertoire où foo.sh
est situé . La commande est donc introuvable.
La variable d'environnement PATH contient une liste de répertoires dans lesquels les commandes sont recherchées. Chaque utilisateur définit sa propre variable PATH en fonction de ses besoins. Pour voir ce qu'il est configuré pour exécuter
env | grep ^PATH
Voici un exemple de sortie de l'exécution du env
ci-dessus commande d'abord en tant qu'utilisateur ordinaire, puis en tant qu'utilisateur root en utilisant sudo
[email protected]:~$ env | grep ^PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
[email protected]:~$ 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 l'utilisateur non privilégié (rkielty) et le super utilisateur ne sont pas les mêmes .
Le répertoire où foo.sh
resident n'est pas présent dans la variable PATH de l'utilisateur root, d'où la commande introuvable erreur.
Les autres solutions que j'ai vues ici jusqu'à présent sont basées sur certaines définitions de système, mais il est en fait possible d'avoir sudo
utiliser le PATH
actuel (avec le env
commande) et/ou le reste de l'environnement (avec le -E
option) 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
, remplaçant le sudo
d'origine .)