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):
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 --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
.
# 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, -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ür localhost
als 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.