Es gibt ein paar Fragen auf der Website, die mit meinem Problem zusammenhängen, aber ich konnte in keiner eine Lösung finden.
Mein Betriebssystem ist Ubuntu 12.04. Ich habe mvn
in /tools/noarch/Apache-maven-3.1.1
installiert und die folgenden Zeilen am Ende meines /etc/profile
hinzugefügt:
export M2_HOME=/tools/noarch/Apache-maven-3.1.1
export PATH=$M2_HOME/bin:$PATH
Danach führe ich source /etc/profile
aus.
Jetzt ist mein Problem: Wenn ich mvn --version
ausführe, ist der Befehl erfolgreich und mvn
ausführbar. Wenn ich Sudo mvn --version
ausführe, erhalte ich die Ausgabe: Sudo: mvn: command not found
. Ich weiß, dass PATH
möglicherweise anders ist, wenn ich einen Befehl mit Sudo
ausführe, und deshalb habe ich Folgendes versucht:
$>Sudo echo $PATH
/tools/noarch/Apache-maven-3.1.1/bin:... some other stuff ...
Ich habe auch versucht, Sudo su -
auszuführen und dann mvn --version
einzugeben. In diesem Fall wird mvn
erfolgreich gefunden und der Befehl ist erfolgreich. Was geht hier vor sich?
$PATH
wird von Ihrer Shell ausgewertet, sodass Ihre Prüfung nicht so funktioniert, wie Sie es erwarten.
/etc/sudoers
ist so konfiguriert, dass Ihr PATH
durch einen Standardcode ersetzt wird.
Sudo
lädt keine Login-Shell-Umgebung, bevor der Befehl ausgeführt wird. Daher wird die Standardeinstellung PATH
aus /etc/sudoers
verwendet. su -
öffnet eine Login-Shell, bei der /etc/profile
geladen wird. Siehe man bash
, AbschnittAUFRUF.
Entfernen Sie einfach das Zurücksetzen von PATH
in /etc/sudoers
. Es ist wahrscheinlich eine Regel namens secure_path
.
In CentOS können Sie PATH
zum Abschnitt Defaults env_keep
hinzufügen:
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"
Gib Sudo
deine aktuelle PATH
mit:
Sudo env "PATH=$PATH" your_command
Um auf die Antwort von @ opyate einzugehen, verwende ich das folgende Shell-Skript (das beispielsweise mysudo
heißen kann):
#!/bin/bash
Sudo -E env "PATH=$PATH" "[email protected]"
-E
weist Sudo
an, die Umwelt zu schonen.env "PATH=$PATH"
wird außerhalb des Aufrufs Sudo
erweitert, wodurch die externe PATH
auch innerhalb der Sudo
verfügbar wird (dies ist zusätzlich zum -E
erforderlich, da die PATH
normalerweise zusätzlich zu der Behandlung, die die gesamte Umgebung erhält, eine Sonderbehandlung erhält)."[email protected]"
übergibt die Argumente, die unser Skript empfängt, an die Zeile Sudo
.Speichern Sie das Skript in einer Datei in einem Verzeichnis in der PATH
, geben Sie ihm die +x
-Berechtigung, und klicken Sie auf OK.
Da die aktuellen Antworten etwas vage sind, lautet die spezifische Einstellung für /etc/sudoers
, mit der Sie Ihren Pfad ändern, secure_path
:
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
Sie können es mit Sudo visudo
ändern oder noch besser die Verzeichnisse hinzufügen, die Sie benötigen:
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin
Ich hatte das gleiche Problem, als ich Maven zum ersten Mal installierte. Das Problem wurde gelöst, nachdem ich die beiden Zeilen hinzugefügt hatte.
export M2_HOME=/tools/noarch/Apache-maven-3.1.1
export PATH=$M2_HOME/bin:$PATH
zu vier Dateien:
/root/.bashrc
/root/.profile
und für den aktuellen Benutzer (mehran
ist mein Ubuntu-Benutzername):
/home/mehran/.bashrc
/home/mehran/.profile
Sie müssen die PATH-Variable von root genau so ändern, wie Sie es für sich getan haben, d. H. , indem Sie diese beiden Zeilen in Sudos Profil hinzufügen, das sich in /root/.bashrc befindet.