Pourquoi exécuter la commande car sudo renvoie la commande introuvable?

12

Exemple de commande:

drush cc all

fonctionne, mais cela:

sudo drush cc all

Donne moi:

sudo: drush: command not found

Pourquoi? Comment régler ceci?

Codium
la source
J'ai également eu ce problème parfois, avec des commandes de base telles que cd. Utilisation du dzdo cdretour de "commande introuvable". Bien sûr , je compris plus tard que cding dans un répertoire que je ne dispose pas des autorisations dans, ne va pas aider beaucoup, donc je soit besoin d' un shell root ou besoin de dzdo ls, dzdo mvetc. le contenu de l' extérieur que dir.
Wildcard
2
Le problème sudo cdest que cdc'est une commande intégrée, pas un programme. Si vous voulez aller dans un répertoire auquel vous n'avez pas accès et (par exemple) y renommer un fichier, vous pouvez faire (par exemple) sudo mv dir/oldfile dir/newfile ou sudo sh -c "cd dir; mv oldfile newfile" .
G-Man dit `` Réintègre Monica ''

Réponses:

13

Lorsque vous sudo, vous obtenez un préconfiguré $PATH, qui est (censé être) quelque chose comme le chemin par défaut de l'utilisateur root . Votre programme ne figure pas dans cette liste de répertoires identifiés par $PATH.

Voir par exemple

sudo essaie d'être en sécurité lors de l'exécution de commandes externes.

Il existe deux façons distinctes de gérer les variables d'environnement. Par défaut, l' option env_reset sudoers est activée. Cette commande causes à exécuter avec un environnement minimal contenant TERM, PATH, HOME, SHELL, LOGNAME, USERet USERNAMEen plus des variables du processus appelant autorisés par les env_checket env_keep sudoers options. Il existe effectivement une liste blanche pour les variables d'environnement.

Si vous ne pouvez pas configurer sudopour conserver votre $PATH, la solution de contournement habituelle consiste à spécifier le chemin d'accès complet du programme. Cela peut ne pas fonctionner correctement avec des scripts qui appellent d'autres exécutables dans le répertoire (non accessible).

Thomas Dickey
la source
0

Vous devez spécifier le chemin complet. C'est aussi plus sûr; Si vous ne spécifiez pas le chemin, il est concevable qu'un attaquant puisse créer un autre programme qui sera exécuté avec les autorisations root.

De plus, vous devez mettre une ligne /etc/sudoerspour le permettre. man sudoerspour la syntaxe, c'est beaucoup trop à mettre ici.

Tom Zych
la source