sudo als ein anderer Benutzer mit ihrer Umgebung

56

$ whoami
admin
$ sudo -S -u otheruser whoami
otheruser
$ sudo -S -u otheruser /bin/bash -l -c 'echo $HOME'
/home/admin

Warum wird nicht $HOMEfestgelegt, /home/otheruserobwohl Bash als Anmeldeshell aufgerufen wird?

Insbesondere /home/otheruser/.bashrcwird nicht bezogen. Wird auch /home/otheruser/.profilenicht beschafft. - ( /home/otheruser/.bash_profileexistiert nicht)

BEARBEITEN: Das genaue Problem ist tatsächlich https://stackoverflow.com/questions/27738224/mkvirtualenv-with-fabric-as-another-user-fails

user80551
quelle
Eine Lösung für diese Frage löst auch die andere Frage. Möglicherweise möchten Sie die andere Frage in dieser Situation löschen.
Pavel Šimerda

Antworten:

83

Um eine Login-Shell aufzurufen, verwenden Sie sudoeinfach -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):

sudo -i

Beispiel (mit einem bestimmten Benutzer):

sudo -i -u user

Beispiel (mit einem Befehl):

sudo -i -u user whoami

Beispiel (Druckbenutzer $HOME):

sudo -i -u user echo \$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 --loginund 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 .

# strace -f -e process sudo -S -i -u user echo \$HOME
execve("/usr/bin/sudo", ["sudo", "-S", "-i", "-u", "user", "echo", "$HOME"], [/* 42 vars */]) = 0
...
[pid 12270] execve("/bin/bash", ["-bash", "--login", "-c", "echo \\$HOME"], [/* 16 vars */]) = 0
...

Mir ist aufgefallen, dass Sie verwenden, -Sund 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ür localhostals auch für andere Hosts und bietet eine Authentifizierung mit öffentlichem Schlüssel, die ohne interaktive Eingabe funktioniert.

ssh user@localhost echo \$HOME

Hinweis: Für SSH sind keine speziellen Optionen erforderlich, da der SSH-Server immer eine Anmeldeshell erstellt, auf die der SSH-Client zugreifen kann.

Pavel Šimerda
quelle
2
sudo -i -u user echo \$HOMEfunktioniert bei mir nicht Ausgang: $HOME. strace liefert die gleiche Ausgabe wie Sie. Was ist das Problem?
John_West
Keine Ahnung, es funktioniert immer noch für mich, ich müsste es sehen oder vielleicht sogar das System berühren.
Pavel Šimerda
10

Sie geben Bash zu viel Anerkennung. Alle "Login-Shell" bedeutet für Bash, welche Dateien beim Starten und Herunterfahren bezogen werden. Die $HOMEVariable 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. $HOMEwird 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 $HOMEund dann exec-ed bash, sudodurch Design die Umwelt nicht ändern , es sei denn gefragt oder so zu tun , konfiguriert, so bashwie Sie es von Ihrem andererbenutzer Shell geerbt.

Wenn Sie sudomehr von der Umgebung so behandeln möchten , wie Sie es erwarten, schauen Sie sich den -iSchalter für sudo an. Versuchen:

sudo -S -u otheruser -i /bin/bash -l -c 'echo $HOME'

Die Manpage für sudo beschreibt es ausführlicher, wenn auch nicht wirklich gut, denke ich: http://linux.die.net/man/8/sudo

Jeff Snider
quelle
4
$ HOME wird nicht von bash gesetzt - Danke, das wusste ich nicht.
user80551
Suchen Sie nach Strace in meiner Antwort. Es zeigt, dass Sie /bin/bash -l -c 'echo $HOME'bei der Verwendung keine Befehlszeile selbst erstellen müssen -i.
Pavel Šimerda
1
Diese sudoSyntax hat einen Fehler auf meinem Computer ausgelöst. ( sunutzt die -cOption, aber ich glaube nicht sudo.) Ich hatte besseres Glück mit:HomeDir=$( sudo -u "$1" -H -s echo "\$HOME" )
palswim
Ja, @palswim ist richtig. -SIch bin mir nicht sicher (ich habe es nicht gebraucht, also habe ich es weggelassen), aber hier -cfunktioniert es nicht, du brauchst es -sstattdessen.
polynomial_donut