Frage

Ich habe sudo Zugriff auf eine unserer Entwicklung RedHat Linux-Boxen gegeben, und ich scheine mich sehr oft zu finden, um Ausgabe an einen Speicherort umleiten ich normalerweise keinen Schreibzugriff haben.

Das Problem ist, dieses erfundene Beispiel funktioniert nicht:

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

Ich erhalte nur die Antwort:

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

Wie kann ich diese Arbeit bekommen?

War es hilfreich?

Lösung

Ihr Befehl nicht funktioniert, weil die Umleitung von der Shell ausgeführt wird, die nicht die Erlaubnis zu /root/test.out zu schreiben hat. Die Umleitung des Ausgangs nicht von sudo ausgeführt.

Es gibt mehrere Lösungen:

  • ein Shell-Run mit sudo und gibt er den Befehl durch die -c Option:

    sudo sh -c 'ls -hal /root/ > /root/test.out'
    
  • ein Skript mit Ihren Befehlen erstellen und das Skript mit sudo ausführen:

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

    Ausführen sudo ls.sh. Siehe Steve Bennett beantworten wenn Sie wollen nicht eine temporäre Datei erstellen.

  • Starten Sie eine Shell mit sudo -s dann Befehle ausführen:

    [nobody@so]$ sudo -s
    [root@so]# ls -hal /root/ > /root/test.out
    [root@so]# ^D
    [nobody@so]$
    
  • Verwenden sudo tee (wenn Sie haben eine Menge zu entkommen, wenn die -c Option):

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

    Die Umleitung /dev/null benötigt wird, um zu stoppen T-Shirt von auf dem Bildschirm ausgegeben wird. Um append statt der Ausgabedatei zu überschreiben (>>), die Verwendung oder tee -a tee --append (die letzte ist spezifisch für GNU coreutils ).

Danke an Jd , Johnathan für die zweiten, dritten und vierten Lösungen.

Andere Tipps

Jemand hat hier nur vorgeschlagen sudoing-T:

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

Dies könnte auch jeden Befehl zu umleiten verwendet werden, zu einem Verzeichnis, das Sie haben keinen Zugang zu. Es funktioniert, weil das T-Shirt-Programm ist effektiv ein „Echo in eine Datei“ Programm, und die Umleitung auf / dev / null ist es auch auf den Bildschirm ausgeben, um es zu stoppen das gleiche wie das Original erfundene Beispiel zu halten oben.

Ein Trick, den ich herausgefunden ich war

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

Das Problem ist, dass der Befehl wird unter sudo laufen, aber die Umleitung wird unter Ihrem Benutzer ausgeführt. Dies wird durch die Schale gemacht und es gibt sehr wenig, was Sie dagegen tun können.

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

Die üblichen Wege, dies zu umgehen sind:

  • Wickeln Sie die Befehle in einem Skript, das Sie unter sudo aufrufen.

    Wenn die Befehle und / oder Dateiänderungen anmelden, können Sie machen die Skript nehmen diese als Argumente. Zum Beispiel:

    sudo log_script command /log/file.txt
    
  • ein Shell Rufen und die Befehlszeile als Parameter übergeben -c

    Dies ist besonders nützlich für eine off-Verbindung Befehle. Zum Beispiel:

    sudo bash -c "{ command1 arg; command2 arg; } > /log/file.txt"
    

Noch eine weitere Variation des Themas:

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

oder natürlich:

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

Sie haben die (kleinen) Vorteil, dass Sie brauchen keine Argumente zu erinnern sudo oder sh / bash

Klärende ein bisschen auf, warum die T-Shirt-Option ist vorzuziehen,

Angenommen, Sie entsprechende Berechtigung haben, den Befehl auszuführen, der die Ausgabe erzeugt, wenn Sie die Ausgabe Ihres Befehls-T-Rohr, nur Abschlag privledges mit sudo und direkten Abschlag erheben schreiben müssen (oder anhängen) in die Datei in Frage.

Im Beispiel in der Frage gegeben, das bedeuten würde:

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

für ein paar weitere Beispiele aus der Praxis:

# 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 können Sie die Ausgabe eines nicht-privilegierten Befehl nehmen und in eine Datei zu schreiben, die in der Regel nur von root beschreibbar ist, die der Ursprung Ihrer Frage ist.

Es ist eine gute Idee, es auf diese Weise, weil der Befehl zu tun, die die Ausgabe erzeugt nicht mit erhöhten Rechten ausgeführt wird. Es scheint nicht, hier mit echo Materie aber, wenn die Quelle Befehl ein Skript, das Sie nicht vollständig vertrauen, ist es von entscheidender Bedeutung.

Beachten Sie die Option -a verwenden, um append anfügen zu Tee (wie >>) in die Zieldatei nicht überschreiben (wie >).

Machen Sie sudo eine Shell ausgeführt, wie folgt aus:

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

So wie ich zu diesem Thema gehen würde, ist:

Wenn Sie schreiben / ersetzen Sie die Datei:

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

Wenn Sie auf die Datei anhängen:

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

Wie wäre es ein Skript zu schreiben?

Dateiname: myscript

#!/bin/sh

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

# end script

Dann sudo verwenden das Skript auszuführen:

sudo ./myscript

Ich würde es auf diese Weise tun:

sudo su -c 'ls -hal /root/ > /root/test.out'

Jedes Mal, wenn ich so etwas wie dies zu tun, ich nur worden root:

# sudo -s
# ls -hal /root/ > /root/test.out
# exit

Es ist wahrscheinlich nicht der beste Weg, aber es funktioniert.

bedeutet nicht, ein totes Pferd zu schlagen, aber es gibt zu viele Antworten hier, die tee verwenden, was bedeutet, dass Sie stdout umleiten müssen /dev/null, wenn Sie eine Kopie auf dem Bildschirm angezeigt werden sollen. Eine einfachere Lösung ist, einfach cat wie folgt zu verwenden:

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

Beachten Sie, wie die Umleitung in Anführungszeichen gesetzt wird, so dass sie von einer Hülle von sudo gestartet ausgewertet wird anstelle der einen läuft es.

Dies ist auf der Antwort basiert Beteiligung tee. Um die Dinge einfacher schrieb ich ein kleines Skript (Ich nenne es suwrite) und legt es in /usr/local/bin/ mit +x Erlaubnis:

#! /bin/sh
if [ $# = 0 ] ; then
    echo "USAGE: <command writing to stdout> | suwrite [-a] <output file 1> ..." >&2
    exit 1
fi
for arg in "$@" ; do
    if [ ${arg#/dev/} != ${arg} ] ; then
        echo "Found dangerous argument ‘$arg’. Will exit."
        exit 2
    fi
done
sudo tee "$@" > /dev/null

Wie in dem USAGE gezeigt im Code, alles, was Sie tun müssen, ist die Ausgabe an diesem Skript Rohr durch die gewünschten Super-User zugängliche Dateinamen gefolgt und es wird automatisch für Ihr Passwort gefragt, wenn benötigt (da es sudo enthält).

echo test | suwrite /root/test.txt

Beachten Sie, dass da dies eine einfache Wrapper für tee ist, wird es auch Abschlag -a Option akzeptieren anhängen, und unterstützt auch gleichzeitig, um mehrere Dateien zu schreiben.

echo test2 | suwrite -a /root/test.txt
echo test-multi | suwrite /root/test-a.txt /root/test-b.txt

Es hat auch einige vereinfach Schutz gegen Schreibvorrichtungen /dev/, die ein Anliegen in einer der Kommentare auf dieser Seite erwähnt wurde.

Vielleicht wurden Sie sudo Zugriff auf nur einige Programme / Pfade gegeben? Dann gibt es keine Möglichkeit zu tun, was Sie wollen. (Es sei denn, Sie werden es irgendwie hacken)

Wenn es nicht der Fall ist, dann können Sie vielleicht Bash-Skript schreiben:

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

Drücken Sie ctrl + d :

chmod a+x myscript.sh
sudo myscript.sh

Hoffe, dass es helfen.

sudo at now  
at> echo test > /tmp/test.out  
at> <EOT>  
job 1 at Thu Sep 21 10:49:00 2017  
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top