.bashrc
ist 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, .bashrc
ist also nicht beteiligt.
sudo su; echo $PATH
führt eine interaktive Instanz der root-Shell aus. Wenn das Bash ist, ~root/.bashrc
wird geladen. Dieses Snippet wird ausgeführt, echo $PATH
sobald 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 $PATH
an der Eingabeaufforderung der interaktiven Shell eingeben, die von gestartet wurde sudo su
, wird der von festgelegte Wert angezeigt ~root/.bashrc
.
Da .bashrc
in 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 .bashrc
für interaktive Bash-Einstellungen wie Tastenzuordnungen, Aliase und Vervollständigungseinstellungen. Legen Sie Umgebungsvariablen in Dateien fest, die beim Anmelden geladen werden: ~/.pam_environment
oder ~/.profile
.
So setzte PATH
in .profile
statt .bashrc
, und entweder betreibt ein Login - Shell mit sudo -i 'echo $PATH'
oder explizit Quelle .profile
mit sudo sh -c '. ~/.profile; echo $PATH'
.
.profile
? Meinen Sie/root/.profile
oder/home/user/.profile
? Ich habe versuchtexport PATH=$PATH:/mydir
, beiden etwas hinzuzufügen . Hat nicht funktioniert Ich habe es ohne versuchtexport
, das hat auch nicht funktioniert.Schauen Sie sich die
-E
und-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.quelle
Du könntest dazu
sudo bash
, was diebash
Startdateien so liest , wie es in derbash
Manualpage / Dokumentation dokumentiert ist. Beachten Sie jedoch, dass dieHOME
Umgebungsvariable möglicherweise nicht richtig festgelegt wird. Dies kann in der systemweitenbash
Startdatei behoben werden (der/etc
genaue Speicherort hängt von der Distribution ab). Testen Sie, ob der Wert$uid
0 ist.quelle