Verwenden Sie sudo su für Befehle?

15

Ich habe letzte Nacht an der Entwicklung meiner Kommandozeilenfähigkeiten gearbeitet und dabei ein Problem festgestellt, bei dem bei der Verwendung von sudo die Fehlermeldung "Erlaubnis verweigert" angezeigt wurde. Als ich jedoch 'sudo su' benutzte und root wurde, funktionierte der Befehl.

Warum hat sudo zunächst nicht funktioniert?

Es war:

$ sudo cat > /var/www/info. php
<?php
phpinfo( ) ;
? >
^D

Aus der Linux Bible 2010 Edition im Abschnitt zum Einrichten eines LAMP-Servers.

wdypdx22
quelle
Wenn Sie kein Beispiel nennen, ist es schwierig, das Problem zu lösen.
LassePoulsen
1
Überlegen sudo -sSie sudo su.
Jeremy L

Antworten:

18

<,> Und >> werden für die Eingabe- / Ausgabeumleitung für Befehle verwendet - eine Funktion, die von der Shell bereitgestellt wird (z. B. bash). Wenn Sie also einen Befehl wie sudo cat > /var/www/info.phpdiesen eingeben, versucht die Shell, die diesen als Eingabe empfängt, die Datei zu öffnen /var/www/info.phpund stellt diese Datei als Standardausgabe für den sudoBefehl bereit . Dem sudoBefehl ist nicht einmal bewusst, ob seine Ausgabe an eine Konsole oder in eine Datei umgeleitet wird, da die Shell, die ihn aufruft, dies erledigt.

Wenn die Shell, in die Sie Ihren Befehl eingegeben haben, Ihre Anmeldeshell oder eine andere Shell ist, die in einem Terminal mit Ihrer Benutzer-ID ausgeführt wird, hat sie dieselben Berechtigungen wie Ihre Benutzer-ID - nicht die von root.

Während in Ihrem Fall der Befehl cat als root ausgeführt wird, wird das Kopieren seiner Ausgabe in /var/www/info.phpvon der Shell versucht, die als normaler Benutzer ausgeführt wird, was erwartungsgemäß fehlschlägt.

Eine Problemumgehung für solche Situationen ist die Verwendung des teeBefehls:

sudo tee /var/www/info.php

Dies hat den beabsichtigten Effekt, dass der gesamte an der Konsole eingegebene Text bis zu ^ D in die als Parameter angegebene Datei eingefügt wird.

Ein möglicherweise unerwünschter Nebeneffekt ist, dass teedie Ausgabe auch an die Standardausgabe zurückgegeben wird. Nachdem Sie also jede Zeile eingegeben und die Eingabetaste gedrückt haben, wird teeeine Kopie davon zurückgegeben. Um dies zu vermeiden, können Sie die folgende Variante verwenden.

sudo tee /var/www/info.php > /dev/null

Details teedazu erhalten Sie über info teeein Terminal.

koushik
quelle
2

sudo funktioniert nicht bei Befehlen, die zum Schreiben einer Datei Berechtigungen benötigen, z. B .:

sudo echo "vm.swappines = 100" >> /etc/sysctl.conf

Dies wird in der sudo-Manpage erklärt.

NightwishFan
quelle
4
Die Erwähnung, dass Sie "sudo -i" oder "sudo -s" verwenden können, um eine Root-Eingabeaufforderung zu erhalten, würde diese Antwort noch verbessern!
Jorge Castro
Der Beispielbefehl enthält keine Pipe. Es gibt eine Umleitung. Auch "funktioniert manchmal nicht" scheint schuppiges Verhalten zu vermitteln sudo. Wie in Koushiks Antwort erwähnt, ist das Verhalten für das Unix-Berechtigungsmodell ziemlich vorhersehbar, konsistent und "korrekt".
msw
2

Das Problem ist, dass der Teil "> foo.txt" von Ihrem Befehlsinterpreter (Shell) interpretiert und ausgeführt wird, lange bevor der Befehl sudo ausgeführt wird. Der Befehl sudo hat keine Ahnung, dass Sie seine Ausgabe in eine Datei umleiten möchten.

Ihr Befehlsinterpreter hat keine Root-Berechtigung (der Befehl sudo wird jedoch später ausgeführt), sodass die Ausgabe nicht an foo.txt umgeleitet werden kann.

Thorbjørn Ravn Andersen
quelle
1

Eine andere Möglichkeit, dies zu lösen, besteht darin, eine Subshell mit sudo zu starten und diesen Befehl in dieser Subshell auszuführen:

$ sudo bash -c "cat > /var/www/info.php"
<?php
phpinfo( ) ;
? >
^D

Hier ist der Befehl "has sudo" bash, und alles, was darin ausgeführt wird, hat root-Berechtigungen.

$ 2c, * -Pike

Hecht
quelle