Ich habe Sudo-Zugriff auf eine unserer RedHat-Linux-Entwicklungsboxen erhalten, und es scheint, dass ich ziemlich oft die Ausgabe an einen Ort umleiten muss, auf den ich normalerweise keinen Schreibzugriff habe.
Das Problem ist, dass dieses erfundene Beispiel nicht funktioniert:
sudo ls -hal /root/ > /root/test.out
Ich erhalte gerade die Antwort:
-bash: /root/test.out: Permission denied
Wie kann ich das zum Laufen bringen?
root
(in diesem Fall lesen Sie die Antworten), aber sehr oft müssen Sie die Datei einfach woanders erstellen, wie Sie selbst.Antworten:
Ihr Befehl funktioniert nicht, da die Umleitung von Ihrer Shell ausgeführt wird, die nicht zum Schreiben berechtigt ist
/root/test.out
. Die Umleitung der Ausgabe wird nicht von sudo durchgeführt.Es gibt mehrere Lösungen:
Führen Sie eine Shell mit sudo aus und geben Sie den Befehl mit der folgenden
-c
Option ein:Erstellen Sie ein Skript mit Ihren Befehlen und führen Sie dieses Skript mit sudo aus:
Ausführen
sudo ls.sh
. Siehe Steve Bennetts Antwort, wenn Sie keine temporäre Datei erstellen möchten.Starten Sie eine Shell mit
sudo -s
und führen Sie dann Ihre Befehle aus:Verwenden Sie
sudo tee
(wenn Sie bei Verwendung der-c
Option viel entkommen müssen ):Die Umleitung zu
/dev/null
wird benötigt, um zu verhindern, dass das T-Stück auf dem Bildschirm ausgegeben wird. Um anhängen , anstatt die Ausgabedatei überschreiben (>>
), die Verwendungtee -a
odertee --append
(die letzte ist spezifisch für GNU coreutils ).Vielen Dank an Jd , Adam J. Forster und Johnathan für die zweite, dritte und vierte Lösung.
quelle
perl -e 'print "STDIN\n"; print STDERR "STDERR\n"; ' > >( tee stdout.log ) 2> >( tee stderr.log >&2 )
Jemand hier hat gerade vorgeschlagen, sudoing Tee:
Dies kann auch verwendet werden, um einen Befehl in ein Verzeichnis umzuleiten, auf das Sie keinen Zugriff haben. Es funktioniert, weil das Tee-Programm effektiv ein "Echo to a File" -Programm ist und die Umleitung zu / dev / null verhindert, dass es auch auf dem Bildschirm ausgegeben wird, damit es das gleiche wie das oben erfundene Beispiel bleibt.
quelle
sudo
(dh für den Befehl selbst) weggelassen werdenEin Trick, den ich selbst herausgefunden habe, war
quelle
sudo dd
ist besser als diesudo tee /root/file > /dev/null
obigen Beispiele!dd
ist der Befehlsname,of=/root/test.out
ist das Argument, das angibt,dd
was die Ausgabedateien sind.of
bedeutet Ausgabedatei unddd
ist ein sehr beliebtes Tool, das sowohl unter Linux als auch unter OSX verwendet wird (hauptsächlich zum Schreiben von Bildern auf Datenträger). Dies ist sicher ein ordentlicher Trick.dd
ist wahrscheinlich genauso nützlich wietee
hier. In beiden Fällen verwenden Sie einen allgemeinen, bekannten Befehl für einen Zweck, der zwar geringfügig vom ursprünglich vorgesehenen Zweck abweicht, aber dennoch bekannt und gut dokumentiert ist. Währenddd
es gut darin ist, große Datenmengen zu kopieren, saugt es nicht mit kleinen Mengen. Dies hat den Vorteil, dass die Ausgabe nicht auch auf die Standardausgabe zurückgeführt wird.sudo dd
nebeneinander eingeben, möchten Sie sehr, sehr sicher gehen, dass die folgenden Argumente korrekt sind (insbesondere unter Berücksichtigung der nicht standardmäßigen Syntax). Sie nennen es nicht umsonst "Disk Destroyer" ...Das Problem ist, dass der Befehl unter ausgeführt
sudo
wird, die Umleitung jedoch unter Ihrem Benutzer ausgeführt wird. Dies geschieht durch die Shell und es gibt sehr wenig, was Sie dagegen tun können.Die üblichen Möglichkeiten, dies zu umgehen, sind:
Schließen Sie die Befehle in ein Skript ein, das Sie unter sudo aufrufen.
Wenn sich die Befehle und / oder die Protokolldatei ändern, können Sie das Skript veranlassen, diese als Argumente zu verwenden. Zum Beispiel:
Rufen Sie eine Shell auf und übergeben Sie die Befehlszeile als Parameter mit
-c
Dies ist besonders nützlich für einmalige zusammengesetzte Befehle. Zum Beispiel:
quelle
Noch eine Variation des Themas:
Oder natürlich:
Sie haben den (winzigen) Vorteil, dass Sie sich keine Argumente für
sudo
odersh
/ merken müssenbash
quelle
Klären Sie ein wenig, warum die Tee-Option vorzuziehen ist
Angenommen, Sie haben die entsprechende Berechtigung zum Ausführen des Befehls, mit dem die Ausgabe erstellt wird. Wenn Sie die Ausgabe Ihres Befehls an tee weiterleiten, müssen Sie nur die Berechtigungen von tee mit sudo erhöhen und tee direkt an die betreffende Datei schreiben (oder anhängen).
in dem Beispiel in der Frage würde das bedeuten:
für ein paar weitere praktische Beispiele:
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. Dies ist der Ursprung Ihrer Frage.
Es ist eine gute Idee, dies auf diese Weise zu tun, da der Befehl, der die Ausgabe generiert, nicht mit erhöhten Berechtigungen ausgeführt wird. Es scheint hier keine Rolle zu spielen,
echo
aber wenn der Quellbefehl ein Skript ist, dem Sie nicht vollständig vertrauen, ist es entscheidend.Beachten Sie, dass Sie die Option -a verwenden können, um das Anhängen (Gefällt mir
>>
) an die Zieldatei anzuhängen, anstatt sie zu überschreiben ( Gefällt mir>
).quelle
Lassen Sie sudo eine Shell wie folgt ausführen:
quelle
Die Art und Weise, wie ich dieses Problem angehen würde, ist:
Wenn Sie die Datei schreiben / ersetzen müssen:
Wenn Sie an die Datei anhängen müssen:
quelle
Wie wäre es mit einem Skript?
Dateiname: Myscript
Verwenden Sie dann sudo, um das Skript auszuführen:
quelle
Wann immer ich so etwas tun muss, werde ich einfach Wurzel:
Es ist wahrscheinlich nicht der beste Weg, aber es funktioniert.
quelle
Ich würde es so machen:
quelle
su
$ sudo su -c 'pstree -sp $$ >/dev/fd/1'
init(1)───gnome-terminal(6880)───bash(6945)───sudo(401)───su(402)───bash(410)───pstree(411)
Sie wollen kein totes Pferd schlagen, aber es gibt zu viele Antworten
tee
, die Sie verwenden. Dies bedeutetstdout
,/dev/null
dass Sie umleiten müssen , es sei denn, Sie möchten eine Kopie auf dem Bildschirm sehen.Eine einfachere Lösung besteht darin, einfach Folgendes zu verwenden
cat
:Beachten Sie, wie die Umleitung in Anführungszeichen gesetzt wird, damit sie von einer Shell ausgewertet wird, die von gestartet wird,
sudo
anstatt von der, auf der sie ausgeführt wird.quelle
sudo bash -c "ls -hal /root > /root/test.out"
. Durch die Verwendung von Tee wird vermieden, dass eine Muschel benötigt wird, während dies bei Katzen nicht der Fall ist.Dies basiert auf der Antwort mit
tee
. Um die Sache zu vereinfachen, habe ich ein kleines Skript geschrieben (ich nenne essuwrite
) und es/usr/local/bin/
mit+x
Erlaubnis eingefügt:Wie in der VERWENDUNG im Code gezeigt, müssen Sie lediglich die Ausgabe an dieses Skript weiterleiten, gefolgt vom gewünschten Dateinamen, auf den der Superuser zugreifen kann, und Sie werden bei Bedarf automatisch zur Eingabe Ihres Kennworts aufgefordert (da es enthält
sudo
).Da dies ein einfacher Wrapper für ist
tee
, wird auch die-a
Option zum Anhängen von tees akzeptiert und das gleichzeitige Schreiben in mehrere Dateien unterstützt.Es bietet auch einen vereinfachten Schutz gegen das Schreiben auf
/dev/
Geräte, der in einem der Kommentare auf dieser Seite erwähnt wurde.quelle
Vielleicht haben Sie Sudo nur Zugriff auf einige Programme / Pfade erhalten? Dann gibt es keine Möglichkeit zu tun, was Sie wollen. (es sei denn, Sie werden es irgendwie hacken)
Wenn dies nicht der Fall ist, können Sie möglicherweise ein Bash-Skript schreiben:
Drücken Sie ctrl+ d:
Hoffe es hilft.
quelle
quelle
sudo
sowieso haben,at
ist nicht nützlich oder notwendig.sudo sh -c 'echo test >/tmp/test.out'
macht das gleiche viel effizienter und eleganter (leidet aber immer noch unter dem Fehler, dass Sie wahrscheinlich Dingeroot
ausführen, die dieses Privileg nicht benötigen; Sie sollten privilegierte Befehle generell vermeiden, wenn Sie können).