Warum gibt "sudo -u root echo` whoami` "keine Wurzel zurück?

11

Wie verwendet man sudo, um einen Befehl als eigentlicher Root-Benutzer unter Ubuntu auszuführen? Ich dachte ursprünglich, dies sei das Standardverhalten von sudo, bis ich lief:

myuser@localhost:~$ sudo echo `whoami`
myuser

myuser@localhost:~$ sudo -u root echo `whoami`
myuser

Dies ist jedoch die Art von Verhalten, die ich möchte, aber nur in einer einzigen Zeile:

myuser@localhost:~$ sudo su -
root@localhost:~# echo `whoami`
root
Cerin
quelle
11
Warum Echo whoami? Sagen Sie einfach sudo whoami .. gibt root zurück
Neo

Antworten:

26

In der Tat es tut sich als root ausführen. Aber, was dir passiert ist , dass die Rück Zecken ausgewertet werden , bevor sudo läuft, wie sie benötigt werden um den Befehl zu bewerten. Direkter, warum nicht einfach das:

sudo whoami

Ihre whoamiIn-Back-Ticks werden tatsächlich in einer Subshell als aktueller Benutzer ausgewertet, weshalb Sie sehen, was Sie tun.

Fataler Fehler
quelle
2
Das ist falsch. sudo läuft mit Root-Rechten, aber nicht als Root.
Manfred Moser
@ Moser, warum druckt sein Befehl dann "root"?
Cerin
4
@ManfredMoser: Es läuft mit der UID 0(Null), das ist genau das, was die Leute „root“ nennen. (Sie hätten Recht gehabt, wenn Sie sudonur die Funktionen erweitert hätten , ohne die UID tatsächlich zu ändern. Aber das ist nicht der Fall.)
user1686
1
M. Moser hat möglicherweise darauf hingewiesen , dass die Set-UID nur die effektive Benutzer-ID des Prozesses ändert , und dass der Prozess selbst dann die tatsächliche Benutzer-ID ändern muss, wie dies tatsächlich der sudoFall ist. Aber nach dem Lesen der Antwort von xyr scheint dies tatsächlich nicht der Fall gewesen zu sein.
JdeBP
7

Die Unterschale ( whoami) wird zuerst wie Sie ausgeführt, und das Ergebnis ( myuser) wird in den sudoBefehl eingefügt . was sudosieht ist echo myuser. Betrachten Sie es als Abkürzung für:

tmpvar=`whoami`
sudo echo "$tmpvar"
Kevin
quelle
1

Hier scheint es einige Vermutungen zu geben ...

Die Backticks machen offensichtlich das, was andere erklärt haben, erweitern sich, whoamibevor sie "sudo" aufrufen, und lassen die Backticks wie erwartet "return" zurück.

Aber es ist nützlich zu verstehen, was tatsächlich mit sudo passiert (8). Also habe ich mir tatsächlich die Manpage angesehen!

"Die reale und effektive UID und GID sind so eingestellt, dass sie mit denen des Zielbenutzers übereinstimmen ..."

Es scheint also, dass das beobachtete Verhalten nichts mit dem Unterschied zwischen effektiver und realer Benutzer-ID zu tun hat.

Es ist auch illustrativ, "sudo printenv" zu machen und nur mit "printenv" zu vergleichen, was mich tatsächlich ein bisschen überrascht hat. Es zeigt, dass [i] einige [/ i] exportierte Variablen verfügbar sind und andere nicht: Es werden HOME, PATH, PS1, SHELL, TERM und EDITOR des aufrufenden Benutzers gemeldet, andere jedoch nicht wie MANPATH, CVSROOT, LD_LIBRARY_PATH oder ENV. Das scheint etwas seltsam, da es dazu führen kann, dass sich Programme anders verhalten als der ursprüngliche Benutzer oder als Root.

Jan Steinman
quelle
0

Mit sudo können Sie jeden Befehl mit Root-Rechten ausführen, jedoch nicht als Root-Benutzer. Der Grund, warum dies nützlich ist, ist, dass mit diesem Setup mehrere Personen Root-Rechte haben können, während die gesamte Protokollierung usw. weiterhin anzeigt, wer die Änderungen vorgenommen hat.

Dieses Setup ist besser als das Teilen von Root-Passwörtern. Als solches hat es ersetzt, einen Root-Benutzer auf vielen Distributionen einschließlich Ubuntu zu haben.

sudo su hingegen macht Sie zum Root-Benutzer und sollte daher nicht wirklich verwendet werden.

Dieser Unterschied erklärt auch Ihr beobachtetes (korrektes) Verhalten.

Manfred Moser
quelle
6
Nein. Was das Verhalten erklärt, ist eine sehr einfache Frage, wie die Befehlssubstitution in der Shell funktioniert. Es hat überhaupt nichts mit Privilegien zu tun.
JdeBP
-2

Sudo gewährt vorübergehend, wer auch immer Sie sind (vorausgesetzt, Sie dürfen in erster Linie sudo), Root-Berechtigungen.

Um root zu sein, musst du dich als root anmelden, der in Ubuntu standardmäßig blockiert ist.

Sie müssen vorsichtig sein, Sudo ist keine Wurzel. Wenn Sie zeigen möchten, dass Fred etwas als sudo ausführt, und die SUDO-Umgebungsvariablen überprüfen, ist SUDO_COMMAND möglicherweise am nützlichsten.

Tony Hopkinson
quelle
Root ist in Ubuntu blockiert? Bist du dir da sicher? Ich weiß, dass es entmutigt ist, aber ich dachte, sie haben es für einen Anfänger nur etwas schwieriger gemacht, indem sie tatsächlich ein obskures Passwort mit einer UUID festgelegt haben, das mit den üblichen Methoden geändert werden kann.
Marty Fried