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?

28voto

jg3 Punkte 483

Zur Erläuterung, warum die Option "Abschlag" vorzuziehen ist

Wenn Sie die Ausgabe Ihres Befehls über die Pipeline an tee weiterleiten, brauchen Sie nur die Rechte von tee mit sudo zu erhöhen und tee anzuweisen, in die betreffende Datei zu schreiben (oder anzuhängen), vorausgesetzt, Sie haben die entsprechende Berechtigung zur Ausführung des Befehls, der die Ausgabe erzeugt.

In dem in der Frage genannten Beispiel würde das bedeuten:

ls -hal /root/ | sudo tee /root/test.out

für einige weitere praktische Beispiele:

# kill off one source of annoying advertisements
echo 127.0.0.1 ad.doubleclick.net | sudo tee -a /etc/hosts

# configure eth4 to come up on boot, set IP and netmask (centos 6.4)
echo -e "ONBOOT=\"YES\"\nIPADDR=10.42.84.168\nPREFIX=24" | sudo tee -a /etc/sysconfig/network-scripts/ifcfg-eth4

In jedem dieser Beispiele nehmen Sie die Ausgabe eines nicht privilegierten Befehls und schreiben in eine Datei, die normalerweise nur von Root geschrieben werden kann, was der Ursprung Ihrer Frage ist.

Es ist eine gute Idee, dies so zu tun, da der Befehl, der die Ausgabe erzeugt, nicht mit erhöhten Rechten ausgeführt wird. Es scheint hier keine Rolle zu spielen mit echo aber wenn es sich bei dem Quellbefehl um ein Skript handelt, dem Sie nicht ganz trauen, ist das entscheidend.

Beachten Sie, dass Sie die Option -a verwenden können, um append append zu tee (wie >> ) in die Zieldatei zu übertragen, anstatt sie zu überschreiben (wie > ).

26voto

Penfold Punkte 2438

Lassen Sie sudo eine Shell ausführen, etwa so:

sudo sh -c "echo foo > ~root/out"

18voto

Nikola Petkanski Punkte 4524

Ich würde in dieser Frage folgendermaßen vorgehen:

Wenn Sie die Datei schreiben/ersetzen müssen:

echo "some text" | sudo tee /path/to/file

Wenn Sie an die Datei anhängen müssen:

echo "some text" | sudo tee -a /path/to/file

14voto

haridsv Punkte 8019

Ich möchte nicht auf ein totes Pferd schlagen, aber es gibt hier zu viele Antworten, die tee was bedeutet, dass Sie die Daten umleiten müssen. stdout à /dev/null es sei denn, Sie möchten eine Kopie auf dem Bildschirm sehen.

Eine einfachere Lösung ist die Verwendung von cat wie diese:

sudo ls -hal /root/ | sudo bash -c "cat > /root/test.out"

Beachten Sie, dass die Umleitung in Anführungszeichen gesetzt ist, damit sie von einer Shell ausgewertet wird, die mit sudo und nicht derjenige, der sie betreibt.

6voto

Wie wäre es, ein Drehbuch zu schreiben?

Dateiname: myscript

#!/bin/sh

/bin/ls -lah /root > /root/test.out

# end script

Verwenden Sie dann sudo, um das Skript auszuführen:

sudo ./myscript

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