"Sudo: source: befehl nicht gefunden"

15
$ source /etc/environment 

$ sudo source /etc/environment 
[sudo] password for t: 
sudo: source: command not found

Es scheint, dass eine andere Shell als bashdie zur Ausführung ausgeführte ausgeführt wird source /etc/environmentund diese Shell nicht sourceso eingebaut ist.

Aber meine und die Standardshells der Wurzel sind beides bash.

$ echo $SHELL
/bin/bash

Wenn sudoindeeds eine andere Shell verwendet, warum? Ich habe die Antwort von slm gesehen , verstehe sie aber in meinem Fall nicht.

Tim
quelle
4
sourceist eine eingebaute Shell ... Sie können keine sudoeingebaute Shell wie einen externen Befehl
ausführen
Ist das Problem, dass Sie die Datei nicht lesen können oder dass die in der Datei definierte Umgebung auf nachfolgende sudo-Befehle angewendet werden soll?
Random832
@ Random832: Die in der Datei definierte Umgebung soll auf nachfolgende sudo-Befehle
Tim

Antworten:

23

sourceist eine eingebaute Shell, daher kann sie nicht ohne die Shell ausgeführt werden. sudoFühren Sie jedoch standardmäßig keine Shell aus. Vonsudo

Prozessmodell

Wenn sudo einen Befehl ausführt, ruft es fork (2) auf, richtet die Ausführungsumgebung wie oben beschrieben ein und ruft den Systemaufruf execve im untergeordneten Prozess auf

Wenn Sie die Shell explizit ausführen möchten, verwenden Sie die -sOption:

# sudo -s source /etc/environment

Das ist immer noch nutzlos, da nach dem Beenden der Shell Umgebungsänderungen verloren gehen.

myaut
quelle
7

Im Bereich der Problemlösung anstatt der Beantwortung der Frage ist hier die (für mich) naheliegendste Möglichkeit, eine Datei zu erstellen, die nur Root lesen kann:

source <(sudo cat /etc/environment)

Dies verwendet die Prozessersetzung . Es nimmt die Ausgabe des catBefehls und wandelt sie in eine Pseudodatei um, an die Sie übergeben können source. source führt dann die Befehle in der aktuellen Shell aus.

Beachten Sie, dass es auf den meisten Systemen /etc/environmentweltweit lesbar ist. Daher sollten Sie in der Lage sein, Folgendes auszuführen:

source /etc/environment
Kevin
quelle
1
Das funktioniert, der Akzeptierte nicht
Claudiu Creanga
2

sudoerwartet einen Befehl, aber Sie geben eine eingebaute Shell an, damit sie den Befehl nicht finden kann. Wenn Sie schreiben type source, können Sie die Ausgabe sehen: source is a shell builtinund die Ausgabe von which sourceist leer.

Zum Beispiel sudo stracewird funktionieren und which stracewird ausgegeben, weil strace ein Befehl ist.

Bearbeiten: Sie können auch sehen, sudo su;sudo source /etc/environmentfunktioniert gut, so dass keine andere Shell verwendet wird.

Esref
quelle