Leiten Sie stdout über ssh um

17

Ich würde gerne rennen

something > file

auf einem Remote-System über ssh, aber wenn ich laufe

ssh host something > file

Die Umleitung wird lokal als ausgeführt ssh etc > file

Ich habe es stattdessen mit 'oder ''oder ddoder mit einer Pfeife versucht |, aber ich kann es nicht zum Laufen bringen. Wie geht das?

Franziskus
quelle
exit status: unix.stackexchange.com/questions/66581/…
Ciro Santilli

Antworten:

11

Versuchen:

ssh host 'something > file'

Hier ist eine erfundene Demonstration einer Möglichkeit, mit Umleitungen, Pipes und Anführungszeichen umzugehen:

ssh host date -d yesterday \| awk "'{print $1}'" \> 'file" "with\ spaces.out'

Die Pipe und die Umleitung werden maskiert, anstatt in einem gesamten äußeren Satz von Anführungszeichen enthalten zu sein, wodurch die Notwendigkeit verringert wird, eine Ebene von Anführungszeichen zu maskieren. Die einfachen Anführungszeichen für den AWK-Befehl sind durch die sie umgebenden doppelten Anführungszeichen geschützt. Der Dateiname könnte auf die gleiche Weise geschützt werden, aber hier zeige ich, wie die einfachen Anführungszeichen die doppelten Anführungszeichen und das Escape schützen.

Bis auf weiteres angehalten.
quelle
Danke - es funktioniert!
Franziskus
2
Da ssh diesen Teil der Kommandozeile ohnehin an die Shell übergibt, benötigen Sie den sh -cTeil nicht.
Jander
Was ist, wenn Ihr Befehl bereits doppelte und einfache Anführungszeichen enthält? Wenn es nicht zu weit vom Thema entfernt ist, sind sich andere sicher, dass sie wissen wollen, wie ...
Labyrinth
1
@labyrinth: Ich habe ein Beispiel hinzugefügt, um Ihnen einige Ideen zu geben. Beachten Sie, dass die lokale Shell die äußerste (n) Menge (n) von Anführungszeichen und die ferne Shell die nächste Stufe belegt. Mit anderen Worten, AWK sieht zum Beispiel keine Anführungszeichen in seinen Argumenten, wie gezeigt, aber es $1ist geschützt, von der Shell als Shell-Variable gesehen zu werden. Aber es wäre nicht so, wenn die Reihenfolge der Anführungszeichen umgekehrt wäre.
Bis auf weiteres angehalten.
10

Noch einfacher, anstatt:

ssh host something > file

tun:

ssh host "something > file"
Amala
quelle
Dies sollte die akzeptierte Antwort sein, da sie früher als die andere eingegangen ist.
phil294
Ja, die akzeptierte Antwort im Jahr 2010 war nicht so gut. Es wurde 2014 wahrscheinlich geändert, um dieser Antwort zu entsprechen. unix.stackexchange.com/revisions/1631/1
Amala
3

Die vorgeschlagene Lösung funktioniert auch mit Rohren

ssh host 'some_command | some_other_command'
Mike
quelle