Pourquoi ne puis-je pas exécuter des commandes? (P. Ex., Vim)

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