Wie wird sudo so eingestellt, dass $HOME in Ubuntu nicht geändert wird, und wie kann dieses Verhalten deaktiviert werden?

Wie wird sudo so eingestellt, dass $HOME in Ubuntu nicht geändert wird, und wie kann dieses Verhalten deaktiviert werden?

Unter Ubuntu 12.04 sieht die Situation folgendermaßen aus , wenn sudo -sdie Variable $HOME nicht geändert wird, mein regulärer Benutzer also ist :regularuser

$ cd
$ pwd
/home/regularuser
$ sudo -s
# cd
# pwd
/home/regularuser

Ich habe Ubuntu vor langer Zeit aufgegeben, daher kann ich nicht sicher sein, aber ich denke, dies ist das Standardverhalten. Meine Fragen sind also:

  1. Wie geht das? Wo ist die Konfiguration?
  2. Wie deaktiviere ich es?

Bearbeiten: Danke für die Antworten, die die Dinge etwas klarer machen, aber ich denke, ich muss ein paar Fragen hinzufügen, um die Antwort zu erhalten, nach der ich suche.

  1. Unter Debian sudo -sändert sich die Variable $HOME in /root. Soweit ich die Antworten und man sudodie Shell, mit der sie ausgeführt wurde, verstehe sudo -s, ist dies die in angegebene /etc/passwd, richtig?
  2. Allerdings ist sowohl unter Ubuntu als auch unter Debian die Shell /etc/passwdfür root /bin/bash. In beiden Systemen kann ich auch nicht herausfinden, wo der Unterschied in .profileoder .bashrcDateien liegt, soweit $HOME betroffen ist, sodass das Verhalten von sudo -sunterschiedlich ist. Kann mir jemand dabei helfen?

Antwort1

Sudo bietet viele Konfigurationsoptionen zur Kompilierungszeit. Sie können die Einstellungen in Ihrer Version mit auflisten sudo -V. Einer der Unterschiede zwischen der Konfiguration in Debian Wheezy und in Ubuntu 12.04 besteht darin, dass die HOMEUmgebungsvariable in Ubuntu erhalten bleibt, in Debian jedoch nicht. Beide Distributionen löschen alle Umgebungsvariablen mit Ausnahme einiger weniger, die ausdrücklich als sicher zum Erhalten gekennzeichnet sind. Daher bleibt in Ubuntu sudo -serhalten , während in Debian gelöscht und dann auf das Home-Verzeichnis des Zielbenutzers gesetzt wird.HOMEHOMEsudo

Sie können dieses Verhalten überschreiben in dersudoersDatei. Ausführen visudo, um die sudoersDatei zu bearbeiten. Es gibt mehrere relevante Optionen:

  • env_keepbestimmt, welche Umgebungsvariablen beibehalten werden. Verwenden Sie diese Option, um die Umgebungsvariable Defaults env_keep += "HOME"des Anrufers beizubehalten oder zu löschen (und durch das Home-Verzeichnis des Zielbenutzers zu ersetzen).HOMEDefaults env_keep -= "HOME"
  • env_resetbestimmt, ob Umgebungsvariablen überhaupt zurückgesetzt werden. Das Zurücksetzen von Umgebungsvariablen ist häufig für Regeln erforderlich, die die Ausführung eines bestimmten Befehls zulassen, hat jedoch keinen direkten Sicherheitsvorteil für Regeln, die ohnehin die Ausführung beliebiger Befehle zulassen.
  • always_set_home, wenn gesetzt, bewirkt, HOMEdass es überschrieben wird, auch wenn es beibehalten wurde, weil env_resetes deaktiviert war oder HOMEin der env_keepListe war. Diese Option hat keine Auswirkung, wenn HOMEes nicht sowieso beibehalten wird.
  • set_homeist wie always_set_home, gilt aber nur für sudo -s, nicht beim Aufruf sudomit einem expliziten Befehl.

Diese Optionen können für einen bestimmten Quellbenutzer, einen bestimmten Zielbenutzer oder einen bestimmten Befehl festgelegt werden. sudoersWeitere Informationen finden Sie im Handbuch.

HOMESie können für einen bestimmten Aufruf jederzeit eine Überschreibung wählen , sudoindem Sie die Option übergeben -H.

Die Shell überschreibt den Wert von niemals HOME. (Er würde gesetzt, HOMEwenn er nicht gesetzt wäre, wird aber sudoimmer auf HOMEdie eine oder andere Weise gesetzt.)

Wenn Sie ausführen sudo -i, sudowird eine erste Anmeldung simuliert. Dazu gehört das Festlegen HOMEdes Home-Verzeichnisses des Zielbenutzers und das Aufrufen einesAnmeldeshell.

Antwort2

Verwenden Sie sudo -H -istattdessen, sudo -sum eine interaktive Root-Shell für die Anmeldung zu erhalten:

sudo -H -i
cd
pwd -P  #  /private/var/root  (on Mac OS X 10.6.8)

Aus man sudo:

-H      The -H (HOME) option sets the HOME environment variable to
        the homedir of the target user (root by default) as
        specified in passwd(5).  By default, sudo does not modify
        HOME (see set_home and always_set_home in sudoers(5)).

Antwort3

Dies hat weniger mit dem Verhalten von zu tun, sudosondern vielmehr mit dem Unterschied zwischen einer „Login-Shell“ und einer „Nicht-Login-Shell“. Die schnelle Lösung ist

$ sudo -i

wie man sehen kann mit:

$ sudo -s
# id
uid=0(root) gid=0(root) groups=0(root)
# echo $HOME
/home/msw
# exit
$ sudo -i
# echo $HOME
/root
# pwd
/root

Wie im Sudo-Handbuch vermerkt:

Die Option -i (Erstanmeldung simulieren) führt die durch den Kennwortdatenbankeintrag des Zielbenutzers angegebene Shell als Anmeldeshell aus. Dies bedeutet, dass anmeldespezifische Ressourcendateien wie .profile oder .login von der Shell gelesen werden. Wenn ein Befehl angegeben ist, wird er über die Option -c der Shell zur Ausführung an die Shell übergeben. Wenn kein Befehl angegeben ist, wird eine interaktive Shell ausgeführt.

Antwort4

sudo -sUm das unterschiedliche Verhalten unter Ubuntu und Debian zu beseitigen , können Sie einen sudoWrapper verwenden (Antwort auf Frage 4):

sudos() {
   local PATH="$(getconf PATH)" root_homedir
   root_homedir="$(sudo -H sh -c 'printf "%s" "$HOME"')"
   sudo sh -c 'export HOME="$0"; exec sh -i' "$root_homedir"
   return 0
}

sudo -k
sudos
{
logname
whoami
id -un
id -ur
echo "PATH: $PATH"
}
exit
echo "PATH: $PATH"

verwandte Informationen