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.
command-line
wdypdx22
quelle
quelle
sudo -s
Siesudo su
.Antworten:
<,> 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.php
diesen eingeben, versucht die Shell, die diesen als Eingabe empfängt, die Datei zu öffnen/var/www/info.php
und stellt diese Datei als Standardausgabe für densudo
Befehl bereit . Demsudo
Befehl 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.php
von der Shell versucht, die als normaler Benutzer ausgeführt wird, was erwartungsgemäß fehlschlägt.Eine Problemumgehung für solche Situationen ist die Verwendung des
tee
Befehls: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
tee
die Ausgabe auch an die Standardausgabe zurückgegeben wird. Nachdem Sie also jede Zeile eingegeben und die Eingabetaste gedrückt haben, wirdtee
eine Kopie davon zurückgegeben. Um dies zu vermeiden, können Sie die folgende Variante verwenden.Details
tee
dazu erhalten Sie überinfo tee
ein Terminal.quelle
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.
quelle
sudo
. Wie in Koushiks Antwort erwähnt, ist das Verhalten für das Unix-Berechtigungsmodell ziemlich vorhersehbar, konsistent und "korrekt".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.
quelle
Eine andere Möglichkeit, dies zu lösen, besteht darin, eine Subshell mit sudo zu starten und diesen Befehl in dieser Subshell auszuführen:
Hier ist der Befehl "has sudo" bash, und alles, was darin ausgeführt wird, hat root-Berechtigungen.
$ 2c, * -Pike
quelle