Frage 'sudo su -' vs 'sudo -i' vs 'sudo / bin / bash' - wann ist es wichtig, welche verwendet wird, oder spielt es überhaupt eine Rolle?


Wenn ich etwas mache, bei dem root Dutzende Male hintereinander eingegeben werden muss, wechsle ich meine Sitzung lieber in eine root-Sitzung. In den verschiedenen Anleitungen und Anweisungen, die ich im Internet verwendet habe, sehe ich sudo su, sudo su -, sudo -i und sudo /bin/bash verwendet werden, um eine Root-Sitzung zu öffnen, aber ich bin nicht klar auf den Unterschied zwischen diesen und wann oder wenn dieser Unterschied von Bedeutung ist.

Kann mir das jemand aufklären?


195
2017-11-12 23:30


Ursprung


Du hast vergessen zu fragen sudo -s und sudo su. - Radu Rădeanu
Verbunden: Unterschied zwischen "su", "sudo -s", "sudo -i" - Radu Rădeanu
Verbunden: Was ist der Unterschied zwischen dem Befehl 'sudo' und dem Befehl 'sudo sh'? - Radu Rădeanu
Verbunden: Was ist der funktionale Unterschied zwischen sudo su und sudo -i? - Radu Rădeanu
@ RaduRădeanu Als ich die Frage eintippte, überprüfte ich die vorgeschlagenen Fragen, und keines von diesen beantwortete wirklich meine vollständige Frage. Dasselbe gilt für die Fragen, die Sie verknüpft haben. Obwohl sie viele neue Informationen für mich enthalten und ich danke Ihnen, dass ich sie verlinkt habe, fand ich sie nicht so vollständig wie die Antwort, die das Benutzerchaos unten bietet, was viel mehr mit dem übereinstimmt, wonach ich gesucht habe. - Paul


Antworten:


Um das zu erklären, müssen Sie wissen, was die Programme tun:

su - Der Befehl su wird verwendet, um zu einem anderen Benutzer zu wechseln (s Hexe u ser), aber Sie können auch zum root-Benutzer wechseln, indem Sie den Befehl ohne Parameter aufrufen. su fordert Sie auf, das Passwort des Benutzers zu ändern, nachdem Sie das Passwort eingegeben haben, das Sie in die Umgebung des Benutzers gewechselt haben.

sudo - sudo soll einen einzelnen Befehl mit root-Rechten ausführen. Aber nicht wie su Sie werden aufgefordert, das Kennwort des aktuellen Benutzers einzugeben. Dieser Benutzer muss sich in der sudoers-Datei (oder einer Gruppe, die sich in der sudoers-Datei befindet) befinden. Standardmäßig "merkt" sich Ubuntu Ihr Passwort 15 Minuten lang, so dass Sie nicht jedes Mal Ihr Passwort eingeben müssen.

bash - Eine Textschnittstelle zur Interaktion mit dem Computer. Es ist wichtig, den Unterschied zwischen Login-, Nicht-Login-, interaktiven und nicht-interaktiven Shells zu verstehen:

  • Login-Shell: Eine Login-Shell protokolliert Sie als Benutzer in das System, hierfür sind Benutzername und Passwort erforderlich. Wenn du schlägst Strg+alt+F1 Um sich in ein virtuelles Terminal einzuloggen, bekommst du nach erfolgreicher Anmeldung eine Login-Shell.
  • Nicht-Login-Shell: Eine Shell, die ohne Anmeldung ausgeführt wird, ist ein aktuell angemeldeter Benutzer. Wenn Sie ein Grafikterminal in Gnome öffnen, ist es eine Nicht-Login-Shell.
  • interaktive Shell: Eine Shell (Login oder Nicht-Login), in der Sie Befehle interaktiv eingeben oder unterbrechen können. Zum Beispiel ein Gnome-Terminal.
  • Nicht interaktive Shell: Eine (Sub-) Shell, die wahrscheinlich von einem automatisierten Prozess ausgeführt wird. Sie werden weder Eingabe noch Ausgabe sehen.

sudo su Anrufe sudo mit dem Befehl su. Bash wird als interaktive Nicht-Login-Shell bezeichnet. Also wird bash nur ausgeführt .bashrc. Sie sehen, dass Sie nach dem Wechsel zu root immer noch im selben Verzeichnis sind:

user@host:~$ sudo su
root@host:/home/user#

sudo su - Diesmal ist es eine Login-Shell, also /etc/profile, .profile und .bashrc ausgeführt werden und Sie befinden sich im Stammverzeichnis von root mit der Umgebung von root.

sudo -i Es ist fast das Gleiche wie sudo su - Die Option -i (simulate initial login) führt die Shell aus, die im Passwortdatenbankeintrag des Zielbenutzers als Login-Shell angegeben ist. Dies bedeutet, dass Login-spezifische Ressourcendateien wie z .profile, .bashrc oder .login wird von der Shell gelesen und ausgeführt.

sudo /bin/bash Dies bedeutet, dass Sie anrufen sudo mit dem Befehl /bin/bash. /bin/bash wird als Nicht-Login-Shell gestartet, so dass alle dot-Dateien nicht ausgeführt werden, sondern bash selbst liest .bashrc des anrufenden Benutzers. Ihre Umgebung bleibt gleich. Dein Zuhause wird nicht zu Hause sein. Sie sind also root, aber in der Umgebung des anrufenden Benutzers.

sudo -sliest die $SHELL Variable und führt den Inhalt aus. Ob $SHELL enthält /bin/bash es ruft auf sudo /bin/bash (siehe oben).

Prüfen: Um zu überprüfen, ob Sie in einer Login-Shell sind oder nicht (funktioniert nur in bash, weil shopt ist ein eingebauter Befehl):

shopt -q login_shell && echo 'Login shell' || echo 'No login shell'

257
2017-11-13 09:43



Nur eine Klarstellung: sudo ermöglicht einem Benutzer, einen Befehl als Superuser auszuführen oder ein anderer Benutzer. Wie auch immer, +1 für deine Mühe. - Radu Rădeanu
@chaos Danke für diese ausgezeichnete Antwort! Es beantwortet meistens meine Fragen, also ging ich voran und markierte die beantwortete Frage, aber ich verstehe nicht, wann es wünschenswert ist, eine bestimmte Shell auszuführen. Ich benutze wirklich nur Ubuntu über die Befehlszeile und ich finde meine häufigste Verwendung zum Öffnen eines root Benutzersitzung (vs. Verwendung sudo) ist, wenn ich etwas mache, das eine starke Nutzung erfordert root B. beim Installieren von etwas Neuem oder beim Durchführen einer größeren Neukonfiguration. Ich habe benutzt sudo /bin/bash, aber anscheinend hat diese Methode einen schlechten Ruf aus irgendeinem Grund, den ich nicht verstehe. - Paul
Außerdem ist es "korrekter" zu sagen, dass su für den Benutzer "switch" steht und nicht für "super user". I.e. Führen Sie ein PHP-Skript aus: su www-data /usr/share/script.php oder su www-data für interaktive Shell. Aber su ohne Benutzernamen wird als Root-Konto (Superuser) betrachtet. - oblivian
Chaos - "shoppt -q login_shell && echo 'Login shell' || echo 'Keine Login-Shell'" Diese Art von Vorschlägen sehe ich oft, aber warum macht es so lange? Der Operator && bedeutet, dass, wenn Exit-Code 0 dann "Doing Next Command" und die Doppel-Pipes (||) sonst (wenn nicht 0) tun, dann diesen Befehl ausführen. Also, was es im Grunde sagt, wenn Exit-Code 0 Echo "Login Shell", wenn Exit-Code 1 (fail) dann Echo "No Login". Warum nicht einfach "shopt -q login_shell; echo $?" $? bedeutet den Ergebnis- / Beendigungscode des vorhergehenden Befehls. In den meisten, wenn nicht alle Programme 0 bedeutet Erfolg, 1 oder mehr bedeutet, scheitern. Also wenn das Echo 0 = Erfolg ist ... - oblivian
@Paul: sudo -i wird vorgeschlagen. Lies hier: ubuntuforums.org/showthread.php?t=1817402 und hier: unix.stackexchange.com/questions/98531/... - Marco Sulla