sudo: source: befehl nicht gefunden

54

Ich habe einige der Standardprofile für Bash aktualisiert und in den folgenden Tutorials festgestellt, dass ich das neue Profil mit den neuen Umgebungseinstellungen neu laden kann, indem ich Folgendes verwende:

source /etc/bash.bashrc

Das einzige ist, dass die neuen Umgebungsvariablen nur meinem aktuellen Benutzer zur Verfügung standen und bei der Verwendung von sudo ignoriert wurden. Sie wurden erst für sudo verfügbar, als ich meine Terminalsitzung schloss und wieder beitrat.

Wenn ich versuche zu benutzen:

sudo source /etc/bash.bashrc

Ich erhalte den Fehler:

sudo: source: command not found

Gibt es eine einfache Möglichkeit, die neuen Bash-Profileinstellungen für sudo zu laden, ohne das Terminal schließen und neu starten zu müssen?

- Anfangs verwendete ich einige Installationsskripte, die auf die Variablen verweisen. Ich fand heraus, dass sie zwar auf die Variablen zugreifen konnten, wenn ich die Skripte direkt aufrief (obwohl dies später zu einem Problem beim Erstellen von Verzeichnissen führen würde, da ich root sein musste), die Installationsskripte jedoch nicht mit sudo aufrief.

Ich habe dies durch Testen mit diesen einfachen Befehlen bewiesen:

echo $ENV_VARIABLE
sudo echo $ENV_VARIABLE

Der erste gibt den Wert der Variablen aus, der zweite jedoch nichts.

HorusKol
quelle
Wie haben Sie versucht, die Variablen von sudo zu verwenden? Beachten Sie, dass bei Verwendung des Befehls "sudo command $ variable" die Variable aus Ihrer Shell und nicht aus der sudo-Umgebung ersetzt wird.
João Pinto

Antworten:

72

Das Problem ist, dass sourcees sich um einen eingebauten Bash-Befehl handelt (kein programmähnliches lsoder grep). Ich denke, ein Ansatz ist, sich als root anzumelden und dann den Quellbefehl auszuführen.

sudo -s
source /etc/bash.bashrc
Marcos Roriz Junior
quelle
3
Sie haben Recht, das Problem ist, dass sourceeine Shell eingebaut ist. sudo suEs ist eine seltsame Art, es sudo -sauszudrücken - besser gesagt , es ist Sudos eigene Art zu sagen: "starte eine Shell als dieser Benutzer." Ihre einzeilige Version funktioniert nicht, da jeder der darin enthaltenen Befehle von der Shell des Hauptbenutzers in einem separaten Unterprozess ausgeführt wird.
Poolie
1
Richtig. Plus BASH liest / etc / bashrc zum Zeitpunkt der Anmeldung. Sie können also auch 'su' mit -, -l oder --login switch verwenden, um die Umgebung dieses Benutzers abzurufen: 'sudo su -', um root zu werden, oder 'su - $ username', um ein anderer Benutzer zu werden.
Das Beispiel "one line" funktioniert nicht, da sueine neue Shell gestartet und "source" erst ausgeführt wird, nachdem sie beendet wurde. Das erste Beispiel funktioniert nur, wenn die zweite Zeile in der Root-Shell verwendet wird.
Lövborg
sudo -sist nicht besser als sudo su. Es wird so oder so keine Wirkung haben.
Lövborg
1
sudo -shat einen ähnlichen Effekt wie das Starten einer Shell, aber für mich scheint es unelegant zu sein, zwei Befehle zu stapeln, um einen anderen Benutzer zu werden, wenn dies einer tun würde.
Poolie
14

Das Problem ist nicht, dass sourcees sich um einen eingebauten Shell-Befehl handelt. Die Tatsache, dass es das ist, was Sie tatsächlich auf den command not foundFehler aufmerksam macht, bedeutet aber nicht, dass es funktionieren würde, wenn es so wäre.

Das eigentliche Problem ist, wie Umgebungsvariablen funktionieren. Und sie funktionieren so: Jedes Mal, wenn ein neuer Prozess gestartet wird, erbt er die Umgebung seines übergeordneten Prozesses, wenn nichts passiert. Aus diesem Grund sollte die Verwendung einer Subshell (z. B. das Eingeben bashin eine Bash-Instanz) und das Betrachten der Ausgabe von envähnliche Ergebnisse liefern wie die übergeordnete Instanz .

Aufgrund der Funktionsweise sudo(wie in der Manpage angegeben) versucht sudo jedoch, die Umgebung des Benutzers zu entfernen und eine "Standard" -Umgebung für den ersetzenden Benutzer zu erstellen, sodass die Befehlsausführung so ausgeführt wird, als hätte der Benutzer, der sie aufgerufen hat, dies getan war der aufrufende Benutzer (das ist das erwartete Verhalten) und daher läuft nautilus so, wie sudo nautiluses einen Ordner im /rootOrdner öffnen sollte , und nicht /home/yourusername.

Damit:

Wenn Sie so etwas tun sudo source script.shund dann sudo command, auch wenn es funktioniert, wäre es nicht erfolgreich, eine Variable auf die spätere zu setzen sudo command.

Um Umgebungsvariablen zu übergeben, können Sie sudo entweder anweisen, die Umgebung zu erhalten (über den -ESchalter und mit den entsprechenden Berechtigungen in Ihrer sudoers-Datei) und / oder sie für den Befehl als festzulegen sudo VAR1=VALUE1 VAR2=VALUE2 command.

ssice
quelle
4

Mit der Bash- Prozess-Substitution können Sie Folgendes tun:

source <(sudo cat /etc/bash.bashrc)
TomDotTom
quelle
1
Wie könnte dies dazu beitragen, eine Root-Shell mit den neuen Einstellungen zu starten?
muru
1
Das OP fragte tatsächlich, wie "... das neue Profil neu laden ..." aus einer Shell, die für sudoden Zugriff auf das Profil benötigt wird. Mit den obigen Schritten können Sie das Profil importieren und dabei das sudo: source: command not founderwähnte Problem vermeiden .
TomDotTom
"Das Einzige ist, dass die neuen Umgebungsvariablen nur meinem aktuellen Benutzer zur Verfügung standen und bei der Verwendung von sudo ignoriert wurden."
muru
3

Wie Marcos sagt , besteht Ihr Hauptproblem darin, dass sourcees sich um einen eingebauten Shell-Befehl handelt, der nur den Shell-Prozess betrifft, in dem er ausgeführt wird.

Die einfache Lösung besteht darin, eine neue Shell als root zu starten. Die Bash wird /etc/bash.bashrcbeim Start automatisch gelesen . Das ist so einfach wie nur zu sagen

sudo bash
Poolie
quelle
2

Das Schließen und erneute Öffnen des Terminals sollte nichts ändern. Standardmäßig entfernt sudo die Umgebung. Um dies zu deaktivieren, fügen Sie -E zu sudo hinzu.

Psusi
quelle
2

Der Fehler tritt auf, weil die Binärdatei, die Sie über die Befehlszeile aufrufen möchten, nur ein Teil der PATH-Variablen des aktuellen Benutzers ist, nicht jedoch ein Teil des PATH des Root-Benutzers.

Sie können dies überprüfen, indem Sie den Pfad der Binärdatei suchen, auf die Sie zugreifen möchten. In meinem Fall habe ich versucht, "bettercap-ng" zu nennen. Also rannte ich,

$ which bettercap-ng
/home/user/work/bin/bettercap`

Ich habe überprüft, ob dieser Speicherort Teil des PFADS meines Root-Benutzers ist.

$ sudo env | grep ^PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

Daher kann sudo die Binärdatei nicht finden, die ich über die Befehlszeile aufrufen möchte. Gibt daher den nicht gefundenen Fehlerbefehl zurück.

Sie können sudo anweisen, den PATH des aktuellen Benutzers zu verwenden, wenn Sie eine Binärdatei wie folgt aufrufen.

sudo -E env "PATH=$PATH" [command] [arguments]

Tatsächlich kann man daraus einen Alias ​​machen:

alias mysudo='sudo -E env "PATH=$PATH"'

Es ist auch möglich, den Alias ​​selbst sudo zu benennen und das ursprüngliche sudo zu ersetzen.

Anonymes Schnabeltier
quelle