Was macht der Befehl 'sudo -s' und wie wird er in diesem Beispiel verwendet?

8

Ich habe folgenden Zweifel. In einem Tutorial zu einer Softwareinstallation, der ich folge, heißt es, dass ich die folgenden Befehle ausführen muss (ich mache es in einer SSH- Shell, daher endet diese Liste der Schritte mit dem exitBefehl):

sudo -s
apt-get update
apt-get install -y build-essential libtool libcurl4-openssl-dev libncurses5-dev libudev-dev autoconf automake screen
exit

Meine Zweifel sind:

Was genau macht der -sParameter nach dem sudoBefehl?

Beim Suchen im Web fand ich Folgendes:

‑S [Befehl] Mit der Option ‑s (Shell) wird die von der Umgebungsvariablen SHELL angegebene Shell ausgeführt, wenn sie festgelegt ist, oder die in der Kennwortdatenbank angegebene Shell. Wenn ein Befehl angegeben wird, wird er zur Ausführung über die Option ‑c der Shell an die Shell übergeben. Wenn kein Befehl angegeben wird, wird eine interaktive Shell ausgeführt

Es scheint mir, dass die sudo -seinen Befehl mit der Umgebungsvariablen der Shell ausführen.

Dies ist mir jedoch nicht klar: In diesem Fall wird der Befehl mit der Umgebungsvariablen ausgeführt? (es wird nur ausgeführt sudo -sund nicht sudo -s [command]).

AndreaNobili
quelle

Antworten:

7

Die einfache Antwort ist, dass Sie eine Root-Shell erhalten. Dafür wird es hier verwendet. Es gibt einen guten technischen Vergleich zwischen dem su, sudo -i, sudo -sund sudo suMethoden auf Unix.SE aber das ist wirklich hier nicht relevant. Der Code hätte jeden verwenden können und hätte funktioniert.

Das Hilfe-Nugget bedeutet ein paar Dinge:

  • Es wird nach einem Befehl in der $SHELLUmgebungsvariablen gesucht . Wenn Sie rennen, werden echo $SHELLSie wahrscheinlich sehen /bin/bash. Das bedeutet, dass Sie eine Root-Instanz von Bash erhalten. Ich bin sicher, wenn Sie zshdabei wären, würden Sie eine Root-Instanz von erhalten zsh.

  • Wenn $SHELLes leer ist, wird auf die /etc/passwdfür diesen Benutzer definierte Standard-Shell zurückgegriffen .

  • Wenn Sie einen Befehl eingeben (z. B. sudo -s whoami), wird dieser tatsächlich ausgeführt:sudo /bin/bash -c "whoami"

  • Wenn Sie keinen Befehl übergeben, wird kein -cArgument übergeben, sodass Sie nur eine interaktive Shell erhalten.

Ich habe den Ausdruck "root" mehrmals verwendet. Mit dem Standard sudo dreht sich alles um die Dinge als root läuft , aber sudo(und su) können Dinge wie andere Benutzer ausführen (wenn Sie die Berechtigung haben , dies zu tun). Ich sage dies nur für die Pedanten, die schreien werden, sudo -s -u $USERdie ihnen keine Wurzelschale geben, wie ich -ses oben versprochen habe .


Und meiner bescheidenen Meinung nach ist es wirklich albern, nur für zwei Befehle root zu werden, ganz zu schweigen davon, dass ein Benutzer versehentlich weitere Befehle als root ausführen könnte. Wenn Sie etwas als root ausführen möchten oder müssen, setzen Sie den Befehl einfach mit sudo:

sudo apt-get update
sudo apt-get install -y build-essential libtool libcurl4-openssl-dev libncurses5-dev libudev-dev autoconf automake screen

Ich würde an jedem Tutorial zweifeln, das vorschlug, eine Root-Shell zu bekommen, außer in den Fällen, in denen Sie eine Unmenge von Befehlen ausführen müssen ... Und selbst dann gibt es Skripte.

Oli
quelle
Perfekte Erklärung. Jetzt ist alles klarer. Ein letzter Zweifel. Wenn ich sudo allen vorherigen Befehlen voranstelle, erhalte ich das gleiche Endergebnis? Ist es wahr oder fehlt mir etwas?
AndreaNobili
@Oli Sie sind 100% korrekt in Bezug auf Zsh, "sudo -s" meldet sich in einer "root" -Shell als "root" und nicht als Super User an.
RCF
@AndreaNobili Ja, dafür sudoist es im Allgemeinen gedacht . Ausführen eines Befehls als root, ohne sich manuell als root anmelden zu müssen.
Oli
Zu Ihrer Information: Ich habe eine Antwort unter Ihrer veröffentlicht, und meine Einstellung sudo -sist aufgrund meines begrenzten Wissens und der zufälligen Situation in der Situation drastisch anders. Trotzdem möchten Sie vielleicht meine "bescheidene" Antwort lesen und möglicherweise Ihre 1/2 Jahrzehnt alte Antwort aktualisieren.
WinEunuuchs2Unix
0

sudo -sführt einen Befehl im aktuellen Verzeichnis aus, wie es ein normaler Benutzer tun würde. Zum Beispiel:

rick@alien:~/askubuntu$ suspendtime
Nov 12 14:06:27 to Nov 12 17:22:21 lasting 11,754 seconds
Nov 12 22:23:37 to Nov 13 04:24:37 lasting 21,660 seconds
(... SNIP ...)
Dec 02 21:58:49 to Dec 03 04:20:52 lasting 22,923 seconds
Dec 03 05:52:43 to Dec 03 16:37:44 lasting 38,701 seconds

Linux uptime 1,859,356 seconds (21 days, 12 hours, 29 minutes, 16 seconds)
45 Suspends 1,173,341 seconds (13 days, 13 hours, 55 minutes, 41 seconds)
Real uptime 686,015 seconds (7 days, 22 hours, 33 minutes, 35 seconds)

rick@alien:~/askubuntu$ sudo suspendtime
sudo: suspendtime: command not found

rick@alien:~/askubuntu$ sudo -H suspendtime
sudo: suspendtime: command not found

rick@alien:~/askubuntu$ sudo -s suspendtime
Nov 12 14:06:27 to Nov 12 17:22:21 lasting 11,754 seconds
(...SNIP...)
Dec 03 05:52:43 to Dec 03 16:37:44 lasting 38,701 seconds

Linux uptime 1,859,431 seconds (21 days, 12 hours, 30 minutes, 31 seconds)
45 Suspends 1,173,341 seconds (13 days, 13 hours, 55 minutes, 41 seconds)
Real uptime 686,090 seconds (7 days, 22 hours, 34 minutes, 50 seconds)

Natürlich ist die Verwendung -sanstelle des Präfixes des Befehls ./möglicherweise nicht so zeitsparend.

WinEunuuchs2Unix
quelle