
Unter Ubuntu 12.04 sieht die Situation folgendermaßen aus , wenn sudo -s
die 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:
- Wie geht das? Wo ist die Konfiguration?
- 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.
- Unter Debian
sudo -s
ändert sich die Variable $HOME in/root
. Soweit ich die Antworten undman sudo
die Shell, mit der sie ausgeführt wurde, verstehesudo -s
, ist dies die in angegebene/etc/passwd
, richtig? - Allerdings ist sowohl unter Ubuntu als auch unter Debian die Shell
/etc/passwd
für root/bin/bash
. In beiden Systemen kann ich auch nicht herausfinden, wo der Unterschied in.profile
oder.bashrc
Dateien liegt, soweit $HOME betroffen ist, sodass das Verhalten vonsudo -s
unterschiedlich 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 HOME
Umgebungsvariable 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 -s
erhalten , während in Debian gelöscht und dann auf das Home-Verzeichnis des Zielbenutzers gesetzt wird.HOME
HOME
sudo
Sie können dieses Verhalten überschreiben in dersudoers
Datei. Ausführen visudo
, um die sudoers
Datei zu bearbeiten. Es gibt mehrere relevante Optionen:
env_keep
bestimmt, welche Umgebungsvariablen beibehalten werden. Verwenden Sie diese Option, um die UmgebungsvariableDefaults env_keep += "HOME"
des Anrufers beizubehalten oder zu löschen (und durch das Home-Verzeichnis des Zielbenutzers zu ersetzen).HOME
Defaults env_keep -= "HOME"
env_reset
bestimmt, 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,HOME
dass es überschrieben wird, auch wenn es beibehalten wurde, weilenv_reset
es deaktiviert war oderHOME
in derenv_keep
Liste war. Diese Option hat keine Auswirkung, wennHOME
es nicht sowieso beibehalten wird.set_home
ist wiealways_set_home
, gilt aber nur fürsudo -s
, nicht beim Aufrufsudo
mit einem expliziten Befehl.
Diese Optionen können für einen bestimmten Quellbenutzer, einen bestimmten Zielbenutzer oder einen bestimmten Befehl festgelegt werden. sudoers
Weitere Informationen finden Sie im Handbuch.
HOME
Sie können für einen bestimmten Aufruf jederzeit eine Überschreibung wählen , sudo
indem Sie die Option übergeben -H
.
Die Shell überschreibt den Wert von niemals HOME
. (Er würde gesetzt, HOME
wenn er nicht gesetzt wäre, wird aber sudo
immer auf HOME
die eine oder andere Weise gesetzt.)
Wenn Sie ausführen sudo -i
, sudo
wird eine erste Anmeldung simuliert. Dazu gehört das Festlegen HOME
des Home-Verzeichnisses des Zielbenutzers und das Aufrufen einesAnmeldeshell.
Antwort2
Verwenden Sie sudo -H -i
stattdessen, sudo -s
um 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, sudo
sondern 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 -s
Um das unterschiedliche Verhalten unter Ubuntu und Debian zu beseitigen , können Sie einen sudo
Wrapper 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"