Befehl bei Verwendung von sudo nicht gefunden

52

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 in mvninstalliert /tools/noarch/apache-maven-3.1.1und die folgenden Zeilen am Ende von meinem hinzugefügt /etc/profile:

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

Danach führe ich aus source /etc/profile.

Nun mein Problem ist: wenn ich laufe mvn --versionder Befehl erfolgreich und mvnausführbare gefunden wird, während , wenn ich ausführen: sudo mvn --versionich die Ausgabe bekommen: sudo: mvn: command not found. Ich weiß, dass PATHdas anders sein kann, wenn ich einen Befehl mit ausführe, sudound deshalb habe ich Folgendes versucht:

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

Eine andere Sache, die ich versucht habe, ist auszuführen sudo su -und dann zu tippen mvn --version. In diesem Fall mvnwird erfolgreich gefunden und der Befehl erfolgreich ausgeführt. Was geht hier vor sich?

izomorphius
quelle

Antworten:

37

$PATH wird von Ihrer Shell ausgewertet, sodass Ihre Prüfung nicht so funktioniert, wie Sie es erwarten.

/etc/sudoersist so konfiguriert, dass sie Ihre PATHdurch eine Standardeinstellung ersetzt.

sudolädt keine Login-Shell-Umgebung, bevor der Befehl ausgeführt wird, daher wird der Standardwert PATHvon /etc/sudoersverwendet. su -öffnet eine Login-Shell, die das Laden beinhaltet /etc/profile. Siehe man bashAbschnitt INVOCATION .

Entfernen Sie einfach den PATHReset in /etc/sudoers. Es ist wahrscheinlich eine Regel namens secure_path.


CentOS

In CentOS können Sie PATHdem Defaults env_keepAbschnitt Folgendes 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"
Daniel Beck
quelle
Danke für die Antwort. Es löst das Problem, aber ich bevorzuge den Lösungsvorschlag in den beiden anderen Antworten, da er nur für Maven und nicht für alle Befehle in meinem PATH eine Änderung vornimmt.
Izomorphius
Zu Ihrer Information: Bitte beachten Sie mein Antwort-Update.
Kriegaex
So führen Sie Binärdateien im aktuellen Verzeichnis aus sudo: ./<some_binary>: command not found. Ich benutze Arch Linux.
Necktwi
47

Geben Sie sudoIhre aktuelle PATHmit:

sudo env "PATH=$PATH" your_command
opyate
quelle
Eine großartige Antwort, bei der keine Einstellungen geändert werden müssen und der Anrufer alles Notwendige tun kann. Ich würde die -EOption aber auch nutzen , um den Rest der Umwelt zu schonen. Tatsächlich ist dies so praktisch, dass es zur einfachen Verwendung in ein Skript / einen Alias ​​/ eine Funktion eingefügt werden kann. Ich werde dies als separate Antwort hinzufügen - aber ein dickes Lob an @opyate!
Tom
Wenn ich versuche, diesen Befehl auszuführen, erhalte ich env: cmd: No such file or directory- Irgendwelche Ideen, warum das so wäre?
Andy
2
@Andy ersetze cmd durch deinen aktuellen Befehl.
opyate
So führen Sie Binärdateien im aktuellen Verzeichnis aus sudo: ./<some_binary>: command not found. Ich benutze Arch Linux.
Necktwi
12

Um auf die Antwort von @ opyate einzugehen, verwende ich das folgende Shell-Skript (das mysudozum Beispiel benannt werden kann):

#!/bin/bash
sudo -E env "PATH=$PATH" "$@"
  • -Esagt sudo, die Umwelt zu schonen.
  • env "PATH=$PATH"wird außerhalb des sudoAnrufs erweitert, um das Externe PATHauch innerhalb des Anrufs verfügbar sudozu machen (dies ist zusätzlich zu -Eder PATHnormalerweise zusätzlich zu der Behandlung, die die gesamte Umgebung erhält, besonderen Behandlung erforderlich ).
  • "$@"Übergibt die Argumente, die unser Skript empfängt, an die sudoZeile.

Speichern Sie das Skript in einer Datei in einem Verzeichnis in der PATH, geben Sie ihm +xBerechtigungen und Voilà.

Tom
quelle
Dies ist eine viel bessere Lösung für diejenigen, die keine vorhandenen Dateien bearbeiten möchten.
Qaisjp
4

Da die aktuellen Antworten etwas vage sind, /etc/sudoerslautet die spezifische Einstellung für die Änderung Ihres Pfades secure_path:

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

Sie können es ändern sudo visudo, indem Sie die gewünschten Verzeichnisse hinzufügen:

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin
Mikemaccana
quelle
2

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 ( mehranist mein Ubuntu-Benutzername):

/home/mehran/.bashrc
/home/mehran/.profile
Mehran Hatami
quelle
1

Sie müssen die PATH-Variable von root genau so ändern, wie Sie es für sich getan haben, dh indem Sie die beiden Zeilen in sudos Profil in /root/.bashrc hinzufügen und dann als Quelle angeben.

MariusMatutiae
quelle
1
Ich habe /root/.bashrc editiert, kann es aber nicht als Quelle verwenden: sudo source /root/.bashrcgets: sudo: source: command not foundund ohne das sudobekomme ich die Erlaubnis verweigert (wie erwartet). Ich glaube, das Starten eines neuen Terminals sollte theoretisch das Gleiche tun wie Source, aber nach dem Starten eines neuen Terminals findet sich sudo mvn --versionimmer noch nichts.
Izomorphius
@izomorphius Sie können keine Sudo-Quelle verwenden. Sie müssen zuerst mit dem Befehl sudo su zu sudo wechseln , dann können Sie die betreffende Datei als Quelle verwenden. Es gibt keinen anderen Weg.
MariusMatutiae