$ whoami
admin
$ sudo -S -u otheruser whoami
otheruser
$ sudo -S -u otheruser /bin/bash -l -c 'echo $HOME'
/home/admin
Warum wird nicht $HOME
festgelegt, /home/otheruser
obwohl Bash als Anmeldeshell aufgerufen wird?
Insbesondere /home/otheruser/.bashrc
wird nicht bezogen. Wird auch /home/otheruser/.profile
nicht beschafft. - ( /home/otheruser/.bash_profile
existiert nicht)
BEARBEITEN: Das genaue Problem ist tatsächlich https://stackoverflow.com/questions/27738224/mkvirtualenv-with-fabric-as-another-user-fails
bash
sudo
environment-variables
user80551
quelle
quelle
Antworten:
Um eine Login-Shell aufzurufen, verwenden Sie
sudo
einfach-i
. Wenn der Befehl nicht angegeben wird, wird eine Anmeldeaufforderung für die Shell angezeigt, andernfalls wird die Ausgabe Ihres Befehls angezeigt.Beispiel (Login-Shell):
Beispiel (mit einem bestimmten Benutzer):
Beispiel (mit einem Befehl):
Beispiel (Druckbenutzer
$HOME
):Hinweis: Der umgekehrte Schrägstrich stellt sicher, dass das Dollarzeichen die Shell des Zielbenutzers erreicht und nicht in der Shell des aufrufenden Benutzers interpretiert wird.
Ich habe gerade das letzte Beispiel mit strace überprüft, das Ihnen genau sagt, was passiert. Das folgende Ergebnis zeigt, dass die Shell mit
--login
und mit dem angegebenen Befehl aufgerufen wird , genau wie bei Ihrem expliziten Aufruf von bash, aber außerdem kann sudo seine eigene Arbeit wie das Setzen des Befehls ausführen$HOME
.Mir ist aufgefallen, dass Sie verwenden,
-S
und ich glaube nicht, dass dies im Allgemeinen eine gute Technik ist. Wenn Sie Befehle als ein anderer Benutzer ausführen möchten, ohne eine Authentifizierung über die Tastatur durchzuführen, möchten Sie möglicherweise stattdessen SSH verwenden. Es funktioniert sowohl fürlocalhost
als auch für andere Hosts und bietet eine Authentifizierung mit öffentlichem Schlüssel, die ohne interaktive Eingabe funktioniert.Hinweis: Für SSH sind keine speziellen Optionen erforderlich, da der SSH-Server immer eine Anmeldeshell erstellt, auf die der SSH-Client zugreifen kann.
quelle
sudo -i -u user echo \$HOME
funktioniert bei mir nicht Ausgang:$HOME
. strace liefert die gleiche Ausgabe wie Sie. Was ist das Problem?Sie geben Bash zu viel Anerkennung. Alle "Login-Shell" bedeutet für Bash, welche Dateien beim Starten und Herunterfahren bezogen werden. Die
$HOME
Variable passt nicht dazu.In den Bash-Dokumenten erfahren Sie mehr über die Bedeutung der Login-Shell: https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html#Bash-Startup-Files
Tatsächlich unternimmt Bash überhaupt nichts, um etwas einzustellen
$HOME
.$HOME
wird durch das festgelegt, was die Shell aufruft (login, ssh usw.), und die Shell erbt es. Was auch immer der Autor der Shell als Admin - Set$HOME
und dann exec-edbash
,sudo
durch Design die Umwelt nicht ändern , es sei denn gefragt oder so zu tun , konfiguriert, sobash
wie Sie es von Ihrem andererbenutzer Shell geerbt.Wenn Sie
sudo
mehr von der Umgebung so behandeln möchten , wie Sie es erwarten, schauen Sie sich den-i
Schalter für sudo an. Versuchen:Die Manpage für sudo beschreibt es ausführlicher, wenn auch nicht wirklich gut, denke ich: http://linux.die.net/man/8/sudo
quelle
/bin/bash -l -c 'echo $HOME'
bei der Verwendung keine Befehlszeile selbst erstellen müssen-i
.sudo
Syntax hat einen Fehler auf meinem Computer ausgelöst. (su
nutzt die-c
Option, aber ich glaube nichtsudo
.) Ich hatte besseres Glück mit:HomeDir=$( sudo -u "$1" -H -s echo "\$HOME" )
-S
Ich bin mir nicht sicher (ich habe es nicht gebraucht, also habe ich es weggelassen), aber hier-c
funktioniert es nicht, du brauchst es-s
stattdessen.