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

254

Wenn ich etwas mache, bei dem root Dutzende Male hintereinander eingegeben werden muss, ziehe ich es vor, meine Sitzung auf eine Root-Sitzung umzustellen. In den verschiedenen Tutorials und Anleitungen habe ich im Internet verwendet wird , sehe ich sudo su, sudo su -, sudo -iund sudo /bin/bashverwendet wird , um eine Root - Sitzung zu öffnen, aber ich bin mir nicht klar über den Unterschied zwischen diesen und wann oder ob diese Differenz Angelegenheiten.

Kann das jemand für mich klären?

Paul
quelle
11
Sie haben vergessen, nach sudo -sund zu fragen sudo su.
Radu Rădeanu
3
@ RaduRădeanu Als ich die Frage eingetippt habe, habe ich die vorgeschlagenen Fragen überprüft und keine davon hat meine vollständige Frage wirklich beantwortet. Gleiches gilt für die Fragen, mit denen Sie verlinkt sind. Obwohl sie eine Menge neuer Informationen für mich enthalten und ich danke Ihnen, dass Sie sie verlinkt haben, fand ich sie nicht so vollständig wie die Antwort, die das Benutzerchaos unten liefert.
Paul

Antworten:

325

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

  • su- Der Befehl suwird verwendet, um zu einem anderen Benutzer ( s witch u ser) zu wechseln. Sie können jedoch auch zum Root-Benutzer wechseln, indem Sie den Befehl ohne Parameter aufrufen. sufordert Sie auf, das Kennwort des Benutzers einzugeben, nachdem Sie das Kennwort eingegeben haben, das Sie zur Benutzerumgebung geändert haben.
  • sudo- sudosoll einen einzelnen Befehl mit Root-Rechten ausführen. Im Gegensatz sudazu werden Sie jedoch aufgefordert, das Kennwort des aktuellen Benutzers einzugeben. Dieser Benutzer muss sich in der sudoers-Datei befinden (oder in einer Gruppe, die sich in der sudoers-Datei befindet). Standardmäßig "merkt" sich Ubuntu 15 Minuten lang Ihr Passwort, damit Sie Ihr Passwort nicht jedes Mal neu eingeben müssen.
  • bash- Eine Textoberfläche zur Interaktion mit dem Computer. Es ist wichtig, den Unterschied zwischen Login-, Non-Login-, Interactive- und Non-Interactive-Shells zu verstehen:

Arten von Muscheln:

  • Login-Shell : Eine Login-Shell meldet Sie als angegebenen Benutzer im System an. Hierzu sind ein Benutzername und ein Kennwort erforderlich. Wenn Sie ctrl+ alt+ F1drücken, um sich in ein virtuelles Terminal einzuloggen, erhalten Sie nach erfolgreicher Anmeldung eine Login-Shell.
  • Nicht-Login-Shell : Eine Shell, die ohne Anmeldung ausgeführt wird, dazu ist ein aktuell angemeldeter Benutzer erforderlich. Wenn Sie ein Grafikterminal in gnome öffnen, handelt es sich um eine Shell ohne Anmeldung.
  • Interaktive Shell : Eine Shell (Anmelden oder Nicht-Anmelden), in der Sie Befehle interaktiv eingeben oder unterbrechen können. Zum Beispiel ein Gnome-Terminal.
  • Nicht interaktive Shell : Eine (Unter-) Shell, die wahrscheinlich von einem automatisierten Prozess ausgeführt wird. Sie sehen weder Eingabe noch Ausgabe.

Die Fälle sind also:

  • sudo suAnrufe sudomit dem Befehl su. Bash wird als interaktive Nicht-Login-Shell bezeichnet. Bash wird also nur ausgeführt .bashrc. Sie können sehen, dass Sie sich nach dem Wechsel zu root immer noch im selben Verzeichnis befinden:

    user@host:~$ sudo su
    root@host:/home/user#
  • sudo su -Diesmal ist es eine Login - Shell, so /etc/profile, .profileund .bashrcwerden ausgeführt , und Sie werden sich in root Home - Verzeichnis mit root - Umgebung zu finden.

  • sudo -iEs ist fast das gleiche wie sudo su -die -I (simulieren Erstanmeldung) Option führt die Shell durch den Passwort - Datenbank - Eintrag des Zielbenutzers als Login - Shell angegeben. Dies bedeutet , dass Login spezifische Ressourcendateien wie .profile, .bashrcoder .loginwird von der Shell gelesen und ausgeführt werden.

  • sudo /bin/bashDas heißt, Sie rufen sudomit dem Befehl auf /bin/bash. /bin/bashwird als Nicht-Login-Shell gestartet, so dass nicht alle Punktedateien ausgeführt werden, sondern die Bash selbst .bashrcvom aufrufenden Benutzer liest . Ihre Umgebung bleibt gleich. Dein Zuhause wird nicht das Zuhause von root sein. Sie sind also root, aber in der Umgebung des anrufenden Benutzers.

  • sudo -sliest die $SHELLVariable und führt den Inhalt aus. Wenn es $SHELLenthält, wird /bin/bashes aufgerufen sudo /bin/bash(siehe oben).

Prüfen:

So überprüfen Sie, ob Sie sich in einer Anmeldeshell befinden oder nicht (funktioniert nur in bash, da shoptes sich um einen integrierten Befehl handelt):

shopt -q login_shell && echo 'Login shell' || echo 'No login shell'
Chaos
quelle
18
Nur eine Klarstellung: sudoErmöglicht es einem zugelassenen Benutzer, einen Befehl als Superuser oder als anderer Benutzer auszuführen . Wie auch immer, +1 für deine Mühe.
Radu Rădeanu
2
@chaos Danke für diese hervorragende Antwort! Meistens werden meine Fragen beantwortet, daher habe ich die beantwortete Frage markiert, aber ich verstehe nicht, wann es wünschenswert ist, eine bestimmte Shell auszuführen. Ich benutze Ubuntu wirklich nur über die Befehlszeile und meine häufigste Verwendung zum Öffnen einer rootBenutzersitzung (im Gegensatz zu "using" sudo) ist, wenn ich etwas mache, das eine starke Nutzung von rootBerechtigungen erfordert , z . Ich habe verwendet sudo /bin/bash, aber anscheinend hat diese Methode einen schlechten Ruf aus irgendeinem Grund, den ich nicht verstehe.
Paul
2
Es ist auch "richtiger" zu sagen, dass su für switch user steht und nicht für super user. Dh ein PHP-Skript ausführen: su www-data /usr/share/script.php oder einfach su www-data für die interaktive Shell. Aber su ohne Benutzernamen übernimmt das Root-Konto (Superuser).
Oblivian
Chaos - "shopt -q login_shell && echo 'Anmeldeshell' || echo 'Keine Anmeldeshell'" Solche Vorschläge sehe ich oft, aber warum so lange? Der Operator && bedeutet, wenn der Exit-Code 0 ist, dann "mache den nächsten Befehl" und die doppelten Pipes (||) bedeuten, dass sonst (wenn nicht 0) dieser Befehl ausgeführt wird. Also, was ist es im Grunde gesagt, wenn Exit-Code 0, dann Echo "Login Shell", wenn Exit-Code 1 (fehlgeschlagen), dann Echo "Kein Login". Warum nicht einfach "shopt -q login_shell; echo $"? $? bedeutet das Ergebnis / Exit-Code des vorhergehenden Befehls. In den meisten Fällen, in denen nicht alle Programme erfolgreich sind, bedeutet 0, dass 1 oder mehr fehlschlagen. Also, wenn das Echo 0 = Erfolg ist ...
Vergessen
2
@Paul: sudo -iwird vorgeschlagen. Lesen Sie hier: ubuntuforums.org/showthread.php?t=1817402 und hier: unix.stackexchange.com/questions/98531/…
Marco Sulla
0

Um nach Unterschieden zu suchen, können Sie die resultierende Umgebung zwischen verschiedenen Aufrufen zerlegen.

Bei einigen kritischen Variablen konnten einige "kleine" Unterschiede festgestellt werden:

  • PATH, LD_LIBRARY_PATH,LD_PRELOAD

oder ein Unterschied in ~ /. Umgang mit Punktdateien ( ~/.config).

Berücksichtigen Sie auch den Besitz von $ HOME-basierten Protokolldateien ( ~/.xsession.errorsusw.) oder xauth-Cookies ( ~/.Xauthority), die von Befehlen generiert werden.

Probieren Sie diese Befehle aus:


# 'su -' vs 'su'

diff <(sudo su - -c env | sort) <(sudo su -c env | sort)


# 'su -' vs 'sudo -i'

diff <(sudo su - -c env | sort) <(sudo -i env | sort)

hute37
quelle