commande introuvable lors de l'utilisation de sudo

53

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 mvninstallé dans /tools/noarch/apache-maven-3.1.1et 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 : quand je lance mvn --versionla commande réussit et mvnexécutable se trouve, alors que si j'Execute: sudo mvn --versionJe reçois la sortie: sudo: mvn: command not found. Je sais que cela PATHpeut être différent quand j'exécute une commande avec sudoet 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, la commande est trouvée et la commande réussit. Qu'est-ce qui se passe ici?

izomorphius soutien monica
la source

Réponses:

38

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

/etc/sudoersest configuré pour remplacer votre PATHpar un par défaut.

sudone charge pas d’environnement shell de connexion avant d’exécuter la commande, la valeur PATHpar défaut de /etc/sudoersest utilisée. su -ouvre un shell de connexion, ce qui implique le chargement /etc/profile. Voir la man bashsection INVOCATION .

Il suffit de retirer la PATHréinitialisation dans /etc/sudoers. C'est probablement une règle appelée secure_path.


CentOS

Dans CentOS, vous pouvez ajouter PATHà la Defaults env_keepsection:

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"
Daniel Beck
la source
Merci pour la réponse. Cela résout le problème, mais je préfère la solution proposée dans les deux autres réponses, car elle ne modifie que maven, pas toutes les commandes de PATH.
Soutien izomorphius Monica
FYI: S'il vous plaît noter ma mise à jour de réponse.
Kriegaex
comment exécuter des binaires dans le répertoire courant sudo: ./<some_binary>: command not found. J'utilise Arch Linux.
Necktwi
47

Donnez sudovotre courant PATHavec:

sudo env "PATH=$PATH" your_command
opyat
la source
Une excellente réponse, qui ne nécessite aucune modification des paramètres, permettant à l'appelant de faire tout ce qui est nécessaire. J'utiliserais l' -Eoption en plus pour préserver le reste de l'environnement. En fait, c’est tellement pratique qu’il peut être placé dans un script / alias / fonction pour une utilisation facile. Je vais ajouter ceci en tant que réponse séparée - mais bravo à @opyate!
Tom
Lorsque j'essaie d'exécuter cette commande, je reçois env: cmd: No such file or directoryune idée - Pourquoi ce serait?
Andy
2
@Andy remplace cmd par votre commande réelle.
opyate
comment exécuter des binaires dans le répertoire courant sudo: ./<some_binary>: command not found. J'utilise Arch Linux.
Necktwi
12

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" "$@"
  • -Edit sudode préserver l'environnement.
  • env "PATH=$PATH"est étendu en dehors de l’ sudoappel, ce qui rend l’extérieur PATHdisponible à l’intérieur de celui-ci sudo(ceci est nécessaire en plus du fait -Equ’il PATHreçoit habituellement un traitement spécial en plus du traitement que reçoit l’ensemble de l’environnement).
  • "$@"passe les arguments que notre script reçoit à la sudoligne.

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

À M
la source
C'est une bien meilleure solution pour ceux qui ne veulent pas éditer de fichiers existants.
Qaisjp
4

Comme les réponses actuelles sont un peu vagues, le paramètre spécifique pour /etc/sudoerschanger de chemin est le suivant secure_path:

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

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

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin
Mikemaccana
la source
2

J'ai eu le même problème lorsque j'ai installé Maven pour la première fois . 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 ( mehranmon nom d'utilisateur Ubuntu):

/home/mehran/.bashrc
/home/mehran/.profile
Mehran Hatami
la source
1

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

MariusMatutiae
la source
1
J'ai modifié le fichier /root/.bashrc mais je ne parviens pas à le trouver : sudo source /root/.bashrcobtient: sudo: source: command not foundet sans l' sudoautorisation, l'autorisation est refusée (comme prévu). Je pense que le démarrage d'un nouveau terminal devrait en principe faire la même chose que la source, mais après le démarrage d'un nouveau terminal, sudo mvn --versionne trouve toujours rien.
Soutien izomorphius Monica
@izomorphius Vous ne pouvez pas source sudo. Vous devez d’abord passer à sudo avec la commande sudo su , puis vous pourrez trouver le fichier en question. Il n'y a pas d'autre moyen de le faire.
MariusMatutiae