Was sind die Unterschiede zwischen "su", "sudo -s", "sudo -i", "sudo su"?

148

Ich habe es bereits aus dem Handbuch gelesen, kann aber keinen Unterschied erkennen.

su - Benutzer-ID ändern oder Superuser werden

sudo -s [command]

Mit der -sOption (shell) wird die von der Umgebungsvariablen SHELL angegebene Shell ausgeführt, sofern sie festgelegt ist, oder die in passwd (5) angegebene Shell. Wenn ein Befehl angegeben ist, wird er zur Ausführung an die Shell übergeben. Andernfalls wird eine interaktive Shell ausgeführt.

sudo -i Beschreibung im Handbuch verschwinden

Smile.Hunter
quelle
7
Verwenden Sie auch nicht, um su usersich von nicht vertrauenswürdigen Shells anzumelden, sondern su - user. Siehe unix.stackexchange.com/q/7013/8250
Lekensteyn
@Lekensteyn wow, tolles Beispiel. Danke für die LOL :)
törzsmókus
1
Erinnere dich immer an das alte Gebot: Du sollst den Namen der Wurzel nicht vergebens beanspruchen!
Törzsmókus
Nicht zu sagen sudo -iist schlecht, aber man kann es
definitiv
Fast
Reinier Post

Antworten:

118

Der Hauptunterschied zwischen diesen Befehlen besteht darin, wie sie den Zugriff auf ihre Funktionen einschränken.

su (was "Ersatzbenutzer" oder "Benutzer wechseln" bedeutet) - genau das bewirkt, dass eine andere Shell-Instanz mit den Berechtigungen des Zielbenutzers gestartet wird. Um sicherzustellen, dass Sie dazu berechtigt sind, werden Sie nach dem Kennwort des Zielbenutzers gefragt . Um root zu werden, müssen Sie das root-Passwort kennen. Wenn mehrere Benutzer auf Ihrem Computer Befehle als root ausführen müssen, müssen sie alle das root-Passwort kennen - beachten Sie, dass es dasselbe Passwort sein wird. Wenn Sie einem der Benutzer die Administratorrechte entziehen müssen, müssen Sie das root-Passwort ändern und es nur denjenigen Personen mitteilen, die den Zugang aufrechterhalten müssen - chaotisch.

sudo (hmm ... was ist die Mnemonik? Super-User-DO?) ist völlig anders. Es verwendet eine Konfigurationsdatei (/ etc / sudoers), in der aufgeführt ist, welche Benutzer Rechte für bestimmte Aktionen haben (Befehle als root ausführen usw.). Beim Aufrufen werden Sie nach dem Kennwort des Benutzers gefragt, der sie gestartet hat - um sicherzustellen, dass die Person bei der Terminal ist wirklich derselbe "Joe", der in aufgeführt ist /etc/sudoers. Um einer Person Administratorrechte zu entziehen, müssen Sie lediglich die Konfigurationsdatei bearbeiten (oder den Benutzer aus einer Gruppe entfernen, die in dieser Konfiguration aufgeführt ist). Dies führt zu einer wesentlich saubereren Verwaltung von Berechtigungen.

Infolgedessen hat der rootBenutzer in vielen Debian-basierten Systemen kein Kennwort festgelegt - dh es ist nicht möglich, sich direkt als root anzumelden.

Außerdem /etc/sudoersermöglicht es einige zusätzliche Optionen angeben - dh Benutzer X ist nur in der Lage zu laufen Programm Y usw.

Die häufig verwendete sudo suKombination funktioniert folgendermaßen: Zuerst werden sudoSie nach Ihrem Kennwort gefragt. Wenn Sie dazu berechtigt sind, rufen Sie den nächsten Befehl ( su) als Superuser auf. Da von suaufgerufen wird root, müssen Sie das Kennwort des Zielbenutzers nicht eingeben. So sudo sukönnen Sie eine Shell als ein anderer Benutzer öffnen (einschließlich root), wenn Sie Superuser - Zugriff durch die erlaubt sind /etc/sudoersDatei.

Sergey
quelle
2
Ich habe noch nie suals "Benutzer wechseln" gesehen, aber immer als Superuser. das Standardverhalten ohne den Benutzernamen eines anderen Benutzers (obwohl es sinnvoll ist). Aus Wikipedia : "Der Befehl su, der bereits 1974 als Superuser [1] bezeichnet wurde, wurde auch als" Ersatzbenutzer "," Spoof-Benutzer "oder" Benutzer festlegen "bezeichnet, da er das Ändern des mit dem aktuellen Konto verknüpften Kontos ermöglicht Terminal (Fenster). "
Dr. Jimbob
5
@dr jimbob: du hast recht, aber ich finde, dass "switch user" irgendwie besser beschreibt, was es tut - obwohl es historisch für "super user" steht. Ich freue mich auch, dass der Wikipedia-Artikel meiner Antwort sehr ähnlich ist - ich habe den Artikel noch nie zuvor gesehen :)
Sergey
11
Die offizielle Bedeutung von "su" ist "Ersatzbenutzer". Siehe: "man su".
Angel O'Sphere
1
@ AngelO'Sphere: Interessanterweise wird in Ubuntus Manpage "substitute" überhaupt nicht erwähnt. In der Manpage unter gnu.org ( gnu.org/software/coreutils/manual/html_node/su-invocation.html ) heißt es in der Tat "su: Führen Sie einen Befehl mit einer Ersatzbenutzer- und Gruppen-ID aus". Ich denke, gnu.org ist eine kanonische Quelle :)
Sergey
1
Was ist sudo su?
Kaz Wolfe
59

sudoErmöglicht das Ausführen von Befehlen in Ihrem eigenen Benutzerkonto mit Root-Rechten. suMit dieser Option können Sie den Benutzer wechseln, sodass Sie tatsächlich als root angemeldet sind.

sudo -sFührt eine Shell mit Root-Rechten aus. sudo -ierfasst auch die Umgebung des Root-Benutzers.

Um den Unterschied zwischen suund zu sehen sudo -s, machen Sie cd ~und dann pwdnach jedem von ihnen. Im ersten Fall befinden Sie sich im Stammverzeichnis des Stammverzeichnisses, da Sie sich im Stammverzeichnis befinden. Im zweiten Fall befinden Sie sich in Ihrem eigenen Home-Verzeichnis, da Sie selbst über Root-Berechtigungen verfügen.

Genau auf diese Frage wird hier noch näher eingegangen .

Mike Scott
quelle
20
"Sie sind selbst mit Root-Rechten" ist nicht das, was tatsächlich passiert :) Eigentlich ist es nicht möglich, "Sie selbst mit Root-Rechten" zu sein - entweder Sie selbst oder Sie selbst. Versuchen Sie in beiden Fällen, whoami einzugeben . Die Tatsache, dass die cd ~Ergebnisse unterschiedlich sind, ist darauf zurückzuführen, dass sudo -s die Umgebungsvariable $ HOME nicht festlegt.
Sergey
1
@Sergey, whoami heißt "root", weil Sie die "whoami" -CMD so ausführen, als hätten Sie sie im Sudo-Modus ausgeführt. Sie scheinen also vorübergehend (für die Dauer dieses Befehls) der Root-Benutzer zu sein, haben aber möglicherweise immer noch keine Vollversion Root-Zugriff gemäß der sudoers-Datei.
Octopus
1
@Octopus: Ich wollte damit sagen, dass ein Prozess unter Unix nur eine UID haben kann und diese UID die Berechtigungen des Prozesses bestimmt. Sie können nicht "Sie selbst mit Root-Rechten" sein, ein Programm läuft entweder mit Ihrer UID oder mit der UID von Root (0).
Sergey
5
In Bezug auf "Sie haben möglicherweise immer noch keinen vollständigen Root-Zugriff gemäß der sudoers-Datei": Die sudoersDatei steuert, wer welchen Befehl als ein anderer Benutzer ausführen kann, dies geschieht jedoch, bevor der Befehl ausgeführt wird. Sobald Sie jedoch einen Prozess als beispielsweise root starten durften - der ausgeführte Prozess hat die UID von root und vollen Zugriff auf das System, kann sudo dies nicht mehr einschränken. Auch hier bist du immer entweder du selbst oder root, es gibt keine "Hälfte-n-Hälfte". Wenn sudoersSie also mit der Datei die Shell als Root ausführen können, sind die Berechtigungen in dieser Shell nicht von einer "normalen" Root-Shell zu unterscheiden.
Sergey
36

Diese Antwort ist ein Betrug meiner Antwort auf einen Betrug dieser Frage , setzen Sie hier die kanonische Antwort auf, damit die Leute sie finden können!

Der Hauptunterschied zwischen sudo -iund sudo -sist:

  • sudo -igibt dir die root-umgebung, dh deine ~/.bashrcwird ignoriert.
  • sudo -sgibt Ihnen die Umgebung des Benutzers, damit Ihre ~/.bashrcrespektiert wird.

Hier ist ein Beispiel, Sie können sehen, dass ich eine Anwendung lslin meinem ~/.bin/Verzeichnis habe, auf die über zugegriffen werden kann, sudo -saber mit der nicht zugegriffen werden kann sudo -i. Beachten Sie auch, dass sich die Bash-Eingabeaufforderung wie gewünscht ändert, sudo -ijedoch nicht mit sudo -s:

dotancohen@melancholy:~$ ls .bin
lsl

dotancohen@melancholy:~$ which lsl
/home/dotancohen/.bin/lsl

dotancohen@melancholy:~$ sudo -i

root@melancholy:~# which lsl

root@melancholy:~# exit
logout

dotancohen@melancholy:~$ sudo -s
Sourced .bashrc

dotancohen@melancholy:~$ which lsl
/home/dotancohen/.bin/lsl

dotancohen@melancholy:~$ exit
exit

Obwohl sudo -ses praktisch ist, Ihnen die vertraute Umgebung zu bieten, empfehle ich die Verwendung aussudo -i zwei Gründen:

  1. Die visuelle Erinnerung, dass Sie sich in einer Root-Sitzung befinden.
  2. Es ist weitaus unwahrscheinlicher, dass die Root-Umgebung mit Malware vergiftet wird, z .bashrc.
dotancohen
quelle
Ich habe bemerkt, dass sudo -s / etc / profile nicht zu verarbeiten scheint, oder irgendetwas, was ich in /etc/profile.d/ habe. Irgendeine Idee warum?
Effekt
@dotancohen - Was meinen Sie mit sudo -seiner Umgebung, mit der ein Benutzer vertraut ist?
Motivierter
@dotancohen - Der Befehl sudo -s bietet bereits visuelle Hinweise, daher bin ich gespannt, warum sudo -i eine bessere Option ist.
Motivierter
9

su fragt nach dem Passwort des Benutzers "root".

sudofragt nach Ihrem eigenen Passwort (und überprüft auch, ob Sie Befehle als root ausführen dürfen, der über konfiguriert wird /etc/sudoers- standardmäßig dürfen alle Benutzerkonten, die zu den Gruppen "admin" oder "sudo" gehören, sudo verwenden).

sudo -sStartet eine Shell als root, ändert aber nicht Ihr Arbeitsverzeichnis. sudo -isimuliert ein Login in das Root-Konto: Ihr Arbeitsverzeichnis wird es sein /root, und Roots .profileetc. werden wie beim Login bezogen.

Marius Gedminas
quelle
1
Um die Antwort vollständiger zu machen: sudo -sist fast gleich su($ HOME ist anders) und sudo -iist gleichsu -
DJCrashdummy
@DJCrashdummy - Warum sagst du fast gleich zu? Was ist anders?
Motiviert
2

In Ubuntu oder einem verwandten System finde ich suim herkömmlichen Sinne für Superuser wenig Verwendung . sudobehandelt diesen Fall viel besser. Es sueignet sich jedoch hervorragend, um in einmaligen Situationen, in denen die Konfiguration von Sudoern dumm wäre, ein anderer Benutzer zu werden.

Wenn ich zum Beispiel mein System von einer Live-CD / einem USB-Stick aus repariere, werde ich oft meine Festplatte und andere notwendige Dinge chrootin das System einbinden. In einem solchen Fall lautet mein erster Befehl im Allgemeinen:

su - myuser  # Note the '-'. It means to act as if that user had just logged in.

Auf diese Weise arbeite ich nicht als Root, sondern als normaler Benutzer und verwende sie dann sudoentsprechend.

Scott Severance
quelle
0
  • su Fragt nach dem root-Passwort, wird root und öffnet eine interaktive Nicht-Login-Shell.
  • su - Fragt nach dem root-Passwort, wird root und öffnet eine interaktive Login-Shell.

  • sudo -s Fragt Sie nach Ihren Passwörtern, wird root und öffnet eine interaktive Nicht-Login-Shell.
  • sudo -i Fragt nach Ihren Passwörtern, wird root, öffnet eine interaktive Login-Shell.

Es wird empfohlen, diese beiden zu verwenden.


  • sudo suFragt nach deinem Passwort, wird für eine Sekunde root und läuft suals root`.
  • sudo su -Fragt nach Ihrem Passwort, wird für eine Sekunde su -root und läuft als root.

Also in diesem Fall laufen Sie sumit sudound Sie müssen nicht root tatsächliche Passwort kennen. Die Ergebnisse stimmen mit suund überein su -.

Ravexina
quelle
Was ist der Unterschied zwischen Login- und Nicht-Login-Shell?
Pilot6