Es hängt stark davon ab, wie Sie Ihr Programm mit sudo
aufrufen oder su
.
Z.B. auf dem System, auf dem ich mich gerade befinde:
.bashrc
COMMAND $HOME $USER Env. $PATH
1. sudo -i (root) root root [1]
2. sudo -s (USER) root USER /home/${USER}/bin:[1]
3. sudo /bin/bash (USER) root USER /home/${USER}/bin:[1]
4. sudo su (root) root USER [1]:/usr/games:/usr/local/games
5. sudo su - (root) root root [1]
Wobei [1]=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Env=Umgebungsvariablen werden für 1 und 5 zurückgesetzt, genommen von $USER in 2,3,4.
Ein Skript oder ein Programm, das mit einer anderen Option gestartet wird, kann also andere $PATH
sehen , $HOME
, seine Shell kann verschiedene .bashrc
lesen ,.profile
und Umgebungsvariablen. Es liest die Datei, die sich auf den $HOME
bezieht . Jeder Benutzer kann seine Umgebung auf unterschiedliche Weise modifizieren (Variablen, $PATH
, .bashrc, .profile, .bash_profile, Alias...). Insbesondere kann ein Benutzer in seinem $PATH
eine andere Reihenfolge der Verzeichnisse haben und folglich kann ein Skript einen Befehl ausführen, z. in /home/$USER/bin
stattdessen dann diejenige im Pfad, die von root erwartet wird.
Sie können das Programm unter sudo -i
ausführen da Sie als root mit su -
angemeldet waren , aber Sie können ein anderes Verhalten haben, wenn Sie es mit sudo MyCommand
ausführen oder mit su -c MyCommand
.
Ab man su
:
Im Beschreibungsteil:
Die aktuelle Umgebung wird an die neue Shell übergeben . Der Wert von $PATH wird zurückgesetzt nach /bin:/usr/bin für normale Benutzer oder /sbin:/bin:/usr/sbin:/usr/bin für den Superuser
...
Im Optionsteil:
- , -l, --login
Stellen Sie eine Umgebung ähnlich wie bereit was der Benutzer erwarten würde, wenn sich der Benutzer direkt angemeldet hätte .
Von Mann sudo
-ich , --Anmeldung
Führen Sie die durch den Kennwortdatenbankeintrag des Zielbenutzers angegebene Shell als Anmelde-Shell aus. Dies bedeutet, dass Login-spezifische Ressourcendateien wie .profile oder .login von der Shell gelesen werden. Wenn ein Befehl angegeben ist, wird er über die Shell-Option -c zur Ausführung an die Shell übergeben. Wenn kein Befehl angegeben ist, wird eine interaktive Shell ausgeführt. sudo
versucht, in das Home-Verzeichnis dieses Benutzers zu wechseln, bevor die Shell ausgeführt wird. Der Befehl wird in einer Umgebung ausgeführt, die der ähnelt, die ein Benutzer bei der Anmeldung erhalten würde . Der Abschnitt Befehlsumgebung im sudoers(5)-Handbuch dokumentiert, wie die Option -i die Umgebung beeinflusst, in der ein Befehl ausgeführt wird, wenn die sudoers-Richtlinie verwendet wird.
Wenn Sie volle sudo
haben Zugriff haben, können Sie root
werden mit sudo su -
, also ist der Sicherheitspunkt strittig.
Tatsächlich gibt es eine Möglichkeit, den Unterschied zwischen einem Programm zu erkennen, das als root
ausgeführt wird und ein Programm lief unter sudo
- mit getuid
gegenüber geteuid
- aber das ist ein erfundener Trick. Warum sollte ein Patch-System das tun?
Es gibt ein paar Unterschiede, wenn Sie eine Root-Shell erhalten, wie von @Hastur hervorgehoben.
Wenn Sie keine Root-Shell erhalten, gibt es weitere Unterschiede. Das Support-Mitglied hat möglicherweise Erfahrung damit, Dinge wie sudo patch -p0 < /root/patch.file
zu tun wobei patch
wird als root ausgeführt, aber <
(Piping aus einer Datei) ist es nicht.