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?
$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
.
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"
Donnez à Sudo
votre PATH
actuelle avec:
Sudo env "PATH=$PATH" your_command
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é.
É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
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
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.