J'ai un accès sudo sur le serveur de mes amis, en cours d'exécution de centos-6.3, mais quand j'essaie d'exécuter certaines commandes comme sudo vim /var/www/html/index.html
j'ai une erreur sudo: vim: command not found
je peux, cependant , Exécutez sudo su
et puis vim /var/www/html/index.html
et cela fonctionne comme prévu.
echo $PATH
et sudo echo $PATH
produisent tous sudo echo $PATH
deux:
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/jared/bin
sudo which vim
cependant cède:
which: no vim in (/sbin:/bin:/usr/sbin:/usr/bin)
J'ai essayé d'ajouter
export PATH=$PATH:/usr/local/bin
À /root/.bashrc
qui /root/.bashrc
le problème lors de l'utilisation de sudo su
mais pas seulement de sudo <command>
.
Comment puis-je utiliser sudo <command>
pour fonctionner?
Lors de l'exécution de sudo
, de nombreux systèmes sont configurés pour effacer l'environnement de toutes les valeurs non listées sur la liste, et pour réinitialiser la variable PATH à une valeur désinfectée.
Vous trouverez le premier comme Defaults env_reset
et plusieurs Defaults env_keep += "SOME_VARIABLE_NAME"
dans /etc/sudoers
. La dernière substitution " PATH
" sécurisée est spécifiée comme Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
– supprime cette ligne pour supprimer ce comportement lors de la sudo
.
La manière dont la variable d'environnement est traitée est imprimée lorsque vous exécutez sudo -V
tant que root
.
Si vous ne souhaitez pas vous débarrasser de ces valeurs par défaut, vous pouvez toujours spécifier des programmes utilisant leur chemin complet ( sudo /usr/local/bin/vim
).
Alternativement, vous pouvez autoriser votre compte à SETENV
dans le fichier sudoers
, par exemple:
%wheel ALL=(ALL) SETENV: ALL
Cela vous permet de remplacer les paramètres d'environnement comme ceci: sudo PATH=$PATH which vim
, car la variable est interprétée par votre shell avant que la commande ne soit exécutée, ce qui entraîne un PATH
hérité (ce qui n'inclura probablement pas /sbin
etc.).
sudo echo $PATH
Ne fait pas ce que vous pensez. $PATH
est remplacé par le shell (votre) avant d' exécuter la commande.
Pour accomplir le comportement souhaité, vous pouvez utiliser sudo -i
.
De l' homme sudo :
-je commande]
L'option -i ( simuler la connexion initiale ) exécute le shell spécifié dans l'entrée passwd (5) de l'utilisateur cible en tant que shell de connexion. Cela signifie que les fichiers de ressources spécifiques à la connexion tels que
.login
ou.login
seront lus par le shell. Si une commande est spécifiée, elle est transmise au shell pour l'exécution.
Comment puis-je utiliser
sudo <command>
pour fonctionner?
Jusqu'à ce que vous résolvent le problème avec les chemins, utilisez un chemin complet
sudo /usr/local/bin/vim /var/www/html/index.html