
Ich habe folgende Zweifel. In einem Tutorial zu einer Softwareinstallation, die ich befolge, steht, dass ich die folgenden Befehle ausführen muss (ich mache das in einemsshShell, daher endet diese Liste der Schritte mit dem exit
Befehl):
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 -s
Parameter nach sudo
dem Befehl?
Bei meiner Suche im Internet habe ich Folgendes herausgefunden:
-s [Befehl] Die Option -s (Shell) führt die Shell aus, die durch die Umgebungsvariable SHELL angegeben ist, sofern diese gesetzt ist, oder die Shell, die in der Kennwortdatenbank angegeben ist. Wenn ein Befehl angegeben ist, wird er über die Option -c der Shell zur Ausführung an die Shell übergeben. Wenn kein Befehl angegeben ist, wird eine interaktive Shell ausgeführt.
Mir scheint, dass sudo -s
ein Befehl unter Verwendung der Umgebungsvariable der Shell ausgeführt wird.
Aber das ist mir nicht klar: Was ist in diesem Fall der Befehl, der mit der Umgebungsvariable ausgeführt wird? (er führt nur aus sudo -s
und nicht sudo -s [command]
).
Antwort1
Die einfache Antwort ist, dass es Ihnen eine Root-Shell gibt. Dafür wird es hier verwendet. Es gibt eine gutetechnischer Vergleich zwischen den Methoden su
, sudo -i
, sudo -s
und sudo su
auf Unix.SEaber das ist hier wirklich nicht relevant. Der Code hätte jeden verwenden können und hätte funktioniert.
Das Hilfe-Nugget bedeutet mehrere Dinge:
Es sucht nach einem Befehl in der
$SHELL
Umgebungsvariable. Wenn Sie es ausführen,echo $SHELL
sehen Sie wahrscheinlich/bin/bash
. Das bedeutet, dass Sie eine Root-Instanz von Bash erhalten. Ich bin sicher, wenn Sie darin wären,zsh
würden Sie eine Root-Instanz von erhaltenzsh
.Wenn
$SHELL
leer ist, wird auf die/etc/passwd
für diesen Benutzer definierte Standard-Shell zurückgegriffen.Wenn Sie einen Befehl angeben (z. B.
sudo -s whoami
), wird dieser tatsächlich ausgeführt:sudo /bin/bash -c "whoami"
Wenn Sie keinen Befehl übergeben, wird kein
-c
Argument übergeben, sodass Sie nur eine interaktive Shell erhalten.
Ich habe den Ausdruck „Wurzel“ mehrmals verwendet.Standard sudo
dreht sich alles darum, Dinge als Root auszuführen, aber sudo
(und su) Dinge als andere Benutzer ausführen zu können (wenn Sie die Berechtigung dazu haben). Ich sage das nur für die Pedanten, die aufschreien werden, dass sudo -s -u $USER
sie dadurch keine Root-Shell erhalten, wie ich -s
oben versprochen habe.
Und in meinembescheidensteMeinung, es ist wirklich dumm, für nur 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, stellen Sie dem Befehl einfach Folgendes voran 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äre gegenüber jedem Tutorial skeptisch, das die Anschaffung einer Root-Shell vorschlägt, außer in den Fällen, in denen Sie wirklich haufenweise Befehle ausführen müssen … Und selbst dann gibt es noch Skripting.
Antwort2
sudo -s
führt einen Befehl im aktuellen Verzeichnis aus, wie es ein normaler Benutzer tun würde. 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 Zeitersparnis möglicherweise nicht so groß, wenn man -s
anstelle des Präfixes für den Befehl verwendet../