Der Befehl sudo liefert keine Quelle für /root/.bashrc

27

Ich habe der PATHVariablen in meiner /root/.bashrc-Datei einen benutzerdefinierten Pfad hinzugefügt

In sudo su; echo $PATHdiesem Fall wird der Eintrag "/ path / to / custom / bins" angezeigt.

Aber ich weiß sudo sh -c 'echo $PATH', es zeigt, /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Die in der .bashrc-Datei hinzugefügten Ordnerpfade sind nicht sichtbar.

Hat der Befehl sudo nicht dieselbe Umgebung wie ein Root-Benutzer?


quelle

Antworten:

32

.bashrcist eine Konfigurationsdatei von bash, nur wenn sie interaktiv ausgeführt wird. Es wird nur geladen, wenn Sie bash starten, nicht, wenn Sie ein anderes Programm wie sh(auch wenn bash über den Namen aufgerufen wird sh) ausführen . Und es wird nur geladen, wenn bash interaktiv ist, nicht, wenn ein Skript oder ein Befehl mit ausgeführt wird -c.

sudo sh -c 'echo $PATH'oder sudo bash -c 'echo $PATH'ruft keine interaktive Shell auf, .bashrcist also nicht beteiligt.

sudo su; echo $PATHführt eine interaktive Instanz der root-Shell aus. Wenn das Bash ist, ~root/.bashrcwird geladen. Dieses Snippet wird ausgeführt, echo $PATHsobald diese interaktive Shell beendet wird. Was auch immer in der interaktiven Shell geschieht, hat keinen Einfluss darauf, was das Snippet am Ende ausgibt. Wenn Sie jedoch echo $PATHan der Eingabeaufforderung der interaktiven Shell eingeben, die von gestartet wurde sudo su, wird der von festgelegte Wert angezeigt ~root/.bashrc.

Da .bashrcin jeder interaktiven Shell kein Aufruf durch Anmeldeshells erfolgt (auch nicht durch interaktive Anmeldeshells, bei denen es sich um einen Konstruktionsfehler in der Bash handelt), ist es der falsche Ort, um Umgebungsvariablen zu definieren. Verwendung .bashrcfür interaktive Bash-Einstellungen wie Tastenzuordnungen, Aliase und Vervollständigungseinstellungen. Legen Sie Umgebungsvariablen in Dateien fest, die beim Anmelden geladen werden: ~/.pam_environmentoder ~/.profile.

So setzte PATHin .profilestatt .bashrc, und entweder betreibt ein Login - Shell mit sudo -i 'echo $PATH'oder explizit Quelle .profilemit sudo sh -c '. ~/.profile; echo $PATH'.

Gilles 'SO - hör auf böse zu sein'
quelle
1
hat viele relevante Punkte über Muscheln angesprochen .... danke ....
1
Wie füge ich es hinzu .profile? Meinen Sie /root/.profileoder /home/user/.profile? Ich habe versucht export PATH=$PATH:/mydir, beiden etwas hinzuzufügen . Hat nicht funktioniert Ich habe es ohne versucht export, das hat auch nicht funktioniert.
falsePockets
@falsePockets Hat was nicht geklappt? Sie sollten eine neue Frage stellen und genau erklären, was Sie tun.
Gilles 'SO - hör auf böse zu sein'
Das, was nicht funktioniert hat, ist genau das, was OP versucht zu tun. Ich versuche, dem Pfad meines Super-Benutzers ein Verzeichnis hinzuzufügen. Ich sollte keine neue Frage stellen, da diese Frage ein Duplikat dieser Frage wäre.
falsePockets
@falsePockets Aber offensichtlich tun Sie nicht dasselbe, um den Superuser-Account zu erreichen. Und da du nicht gesagt hast, was du tust, kann ich dir nicht anders helfen, als zu wiederholen, was bereits in meiner Antwort steht.
Gilles 'SO - hör auf böse zu sein'
14

Schauen Sie sich die -Eund -i-Optionen an.

-E: Gibt der Sicherheitsrichtlinie an, dass der Benutzer seine vorhandenen Umgebungsvariablen beibehalten möchte. Die Sicherheitsrichtlinie gibt möglicherweise einen Fehler zurück, wenn der Benutzer keine Berechtigung zum Schützen der Umgebung hat.

-i: Führen Sie die vom Kennwortdatenbankeintrag des Zielbenutzers angegebene Shell als Anmeldeshell aus. Dies bedeutet, dass anmeldungsspezifische Ressourcendateien wie .profile oder .login von der Shell gelesen werden. Wenn ein Befehl angegeben wird, wird er über die Option -c der Shell zur Ausführung an die Shell übergeben. Wird kein Befehl angegeben, wird eine interaktive Shell ausgeführt. sudo versucht, in das Ausgangsverzeichnis dieses Benutzers zu wechseln, bevor die Shell ausgeführt wird. Der Befehl wird in einer Umgebung ausgeführt, die der Umgebung ähnelt, die ein Benutzer beim Anmelden erhalten würde. Der Abschnitt Befehlsumgebung im Handbuch sudoers (5) dokumentiert, wie sich die Option -i auf die Umgebung auswirkt, in der ein Befehl ausgeführt wird, wenn die Richtlinie sudoers gilt in Benutzung.

Vinz
quelle
3

Du könntest dazu sudo bash, was die bashStartdateien so liest , wie es in der bashManualpage / Dokumentation dokumentiert ist. Beachten Sie jedoch, dass die HOMEUmgebungsvariable möglicherweise nicht richtig festgelegt wird. Dies kann in der systemweiten bashStartdatei behoben werden (der /etcgenaue Speicherort hängt von der Distribution ab). Testen Sie, ob der Wert $uid0 ist.

Ned64
quelle