1131 Stimmen

Wie verwende ich sudo, um die Ausgabe an einen Ort umzuleiten, für den ich keine Schreibrechte habe?

Ich habe sudo-Zugriff auf eine unserer RedHat-Linux-Entwicklungsboxen erhalten und muss anscheinend oft Ausgaben an einen Ort umleiten, auf den ich normalerweise keinen Schreibzugriff habe.

Das Problem ist, dass dieses konstruierte Beispiel nicht funktioniert:

sudo ls -hal /root/ > /root/test.out

Ich habe gerade die Antwort erhalten:

-bash: /root/test.out: Permission denied

Wie kann ich das zum Laufen bringen?

1568voto

Cristian Ciupitu Punkte 19150

Ihr Befehl funktioniert nicht, weil die Umleitung von Ihrer Shell durchgeführt wird, die nicht die Berechtigung hat, in /root/test.out . Die Umlenkung des Ausgangs ist nicht durchgeführt von sudo.

Es gibt mehrere Lösungen:

  • Führen Sie eine Shell mit sudo aus und geben Sie ihr den Befehl mit dem Befehl -c Option:

    sudo sh -c 'ls -hal /root/ > /root/test.out'
  • Erstellen Sie ein Skript mit Ihren Befehlen und führen Sie dieses Skript mit sudo aus:

    #!/bin/sh
    ls -hal /root/ > /root/test.out

    Ejecutar sudo ls.sh . Siehe Steve Bennett's Antwort wenn Sie keine temporäre Datei erstellen wollen.

  • Starten Sie eine Shell mit sudo -s und führen Sie dann Ihre Befehle aus:

    [nobody@so]$ sudo -s
    [root@so]# ls -hal /root/ > /root/test.out
    [root@so]# ^D
    [nobody@so]$
  • Utilice sudo tee (wenn Sie bei der Verwendung der Option -c Option):

    sudo ls -hal /root/ | sudo tee /root/test.out > /dev/null

    Die Weiterleitung zu /dev/null ist erforderlich, um die tee von der Ausgabe auf dem Bildschirm. Zu anhängen. anstatt die Ausgabedatei zu überschreiben ( >> ), verwenden tee -a o tee --append (der letzte Punkt ist spezifisch für GNU coreutils ).

Der Dank geht an Jd , Adam J. Forster y Johnathan für die zweite, dritte und vierte Lösung.

144voto

Jonathan Punkte 24623

Jemand hier hat soeben vorgeschlagen, den Tee zu sudoing:

sudo ls -hal /root/ | sudo tee /root/test.out > /dev/null

Dies kann auch verwendet werden, um einen beliebigen Befehl in ein Verzeichnis umzuleiten, auf das Sie keinen Zugriff haben. Es funktioniert, weil das Programm tee im Grunde ein "Echo in eine Datei"-Programm ist, und die Umleitung nach /dev/null soll verhindern, dass es auch auf dem Bildschirm ausgegeben wird, damit es dasselbe ist wie das ursprüngliche, erfundene Beispiel oben.

103voto

rhlee Punkte 3659

Ein Trick, den ich selbst herausgefunden habe, war

sudo ls -hal /root/ | sudo dd of=/root/test.out

69voto

dsm Punkte 10073

Das Problem ist, dass die Befehl wird unterlaufen sudo aber die Nachsendung wird unter Ihrem Benutzer ausgeführt. Dies wird von der Shell erledigt, und Sie können nur wenig dagegen tun.

sudo command > /some/file.log
`-----v-----'`-------v-------'
   command       redirection

Die üblichen Methoden zur Umgehung dieses Verfahrens sind:

  • Verpacken Sie die Befehle in ein Skript, das Sie unter sudo aufrufen.

    Wenn sich die Befehle und/oder die Protokolldatei ändern, können Sie das Skript diese als Argumente verwenden. Zum Beispiel:

    sudo log_script command /log/file.txt
  • Aufruf einer Shell und Übergabe der Befehlszeile als Parameter mit -c

    Dies ist besonders nützlich für einmalige zusammengesetzte Befehle. Zum Beispiel:

    sudo bash -c "{ command1 arg; command2 arg; } > /log/file.txt"
  • Einrichten einer Pipe/Subshell mit den erforderlichen Rechten (z. B. sudo)

    # Read and append to a file
    cat ./'file1.txt' | sudo tee -a '/log/file.txt' > '/dev/null';
    
    # Store both stdout and stderr streams in a file
    { command1 arg; command2 arg; } |& sudo tee -a '/log/file.txt' > '/dev/null';

32voto

Steve Bennett Punkte 97061

Eine weitere Variation des Themas:

sudo bash <<EOF
ls -hal /root/ > /root/test.out
EOF

Oder natürlich auch nicht:

echo 'ls -hal /root/ > /root/test.out' | sudo bash

Sie haben den (kleinen) Vorteil, dass man sich keine Argumente merken muss, um sudo o sh / bash

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X