web-dev-qa-db-fra.com

commande introuvable lors de l'utilisation de sudo

Il y a quelques questions sur le site qui semblent liées à mon problème mais je n'ai pu trouver de solution à aucune d'entre elles.

Mon système d'exploitation est Ubuntu 12.04. J'ai installé mvn dans /tools/noarch/Apache-maven-3.1.1 et j'ai ajouté les lignes suivantes à la fin de mon /etc/profile:

export M2_HOME=/tools/noarch/Apache-maven-3.1.1
export PATH=$M2_HOME/bin:$PATH

Après cela, j'exécute source /etc/profile.

Maintenant, mon problème est le suivant: lorsque j'exécute mvn --version, la commande aboutit et un exécutable mvn est trouvé, tandis que si j'exécute: Sudo mvn --version, je récupère le résultat: Sudo: mvn: command not found. Je sais que PATH peut être différent lorsque j'exécute une commande avec Sudo et c'est pourquoi j'ai essayé ceci:

$>Sudo echo $PATH
/tools/noarch/Apache-maven-3.1.1/bin:... some other stuff ...

Une autre chose que j'ai essayée est d'exécuter Sudo su - puis de taper mvn --version. Dans ce cas, mvn est trouvé et la commande réussit. Qu'est-ce qui se passe ici?

45
izomorphius

$PATH est évalué par votre shell. Votre chèque ne fonctionne donc pas comme prévu.

/etc/sudoers est configuré pour remplacer votre PATH par un autre par défaut.

Sudo ne charge pas un environnement de connexion avant d'exécuter la commande. La valeur par défaut PATH à partir de /etc/sudoers est utilisée. su - ouvre un shell de connexion, ce qui implique le chargement de /etc/profile. Voir man bash, sectionINVOCATION.

Supprimez simplement la réinitialisation PATH dans /etc/sudoers. C'est probablement une règle appelée secure_path.


CentOS

Dans CentOS, vous pouvez ajouter PATH à la section Defaults env_keep:

Defaults    env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR \
                        LS_COLORS MAIL PS1 PS2 QTDIR USERNAME \
                        LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION \
                        LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC \
                        LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS \
                        _XKB_CHARSET XAUTHORITY PATH"
35
Daniel Beck

Donnez à Sudo votre PATH actuelle avec:

Sudo env "PATH=$PATH" your_command
39
opyate

En développant la réponse de @ opyate, j’utilise le script Shell suivant (qui peut être nommé mysudo, par exemple):

#!/bin/bash
Sudo -E env "PATH=$PATH" "$@"
  • -E indique Sudo pour préserver l'environnement.
  • env "PATH=$PATH" est développé en dehors de l'appel Sudo, rendant la PATH externe également disponible dans la Sudo (ceci est requis en plus du -E car la PATH reçoit habituellement un traitement spécial en plus du traitement de l'environnement complet).
  • "$@" passe les arguments que notre script reçoit à la ligne Sudo.

Enregistrez le script dans un fichier d'un répertoire de la PATH, donnez-lui les autorisations +x, et le tour est joué.

11
Tom

Étant donné que les réponses actuelles sont un peu vagues, le paramètre spécifique dans /etc/sudoers modifiant votre chemin est secure_path:

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin

Vous pouvez le modifier avec Sudo visudo ou, encore mieux, ajouter les répertoires dont vous avez besoin:

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin
4
mikemaccana

J'ai eu le même problème quand j'ai installé Maven . Le problème a été résolu après avoir ajouté les deux lignes,

export M2_HOME=/tools/noarch/Apache-maven-3.1.1
export PATH=$M2_HOME/bin:$PATH

à quatre fichiers:

/root/.bashrc
/root/.profile

et pour l'utilisateur actuel (mehran est mon nom d'utilisateur Ubuntu):

/home/mehran/.bashrc
/home/mehran/.profile
2
Mehran Hatami

Vous devez modifier la variable PATH de root exactement comme vous l'avez fait pour vous-même, c'est-à-dire en ajoutant ces deux lignes dans le profil de Sudo, situé dans /root/.bashrc, puis source.

1
MariusMatutiae