Kann nicht in diff Pipe?


74

Ich wollte schlau sein und eine entfernte Datei mit einer lokalen Datei vergleichen, ohne sie vorher manuell herunterzuladen. Ich kann den Inhalt der Remote-Datei von erhalten

ssh user@remote-host "cat path/file.name"

Leiten Sie das jedoch an diff

ssh user@remote-host "cat path/file.name" | diff path/file.name

gibt mir das:

diff: missing operand after `path/file.nae'
diff: Try `diff --help' for more information.

Ich habe ssh-Schlüssel eingerichtet, daher werde ich nicht zur Eingabe eines Passworts aufgefordert. Was ist eine Problemumgehung dafür?


5
Übrigens, wenn Sie dies tun, laden Sie die Datei immer noch herunter (da ihr Inhalt über die SSH-Verbindung gesendet wird), speichern Sie sie einfach nirgendwo. Es ist also nicht so, dass Sie Bandbreite oder etwas sparen.
David Z

2
Ja, ich möchte mein Dateisystem einfach nicht mit One-Shot-Dateien durcheinander bringen.
User394

1
Wenn der Befehl stdin nicht unterstützt (z. B. via -), können Sie verwenden /dev/stdin. zBdiff file1 /dev/stdin
Strg-Alt-Delor

Antworten:


92

Versuchen Sie, -mit die Standardeingabe darzustellen.

ssh user@remote-host "cat path/file.name" | diff path/file.name -


beim vergleich von riesigen dateien (wie linux disk images) werden diese alle auf der konsole ausgegeben! selbst mit diff -s (für "same") macht es das.
User391339

65

Hier ist eine Problemumgehung: Scheint diff<( expr ) als Argumente zu akzeptieren :

diff <(ssh \"cat path/file.name/") <(cat path/file.name)

17
Das ist kein Unterschied, das ist die Shell (bash, ksh und zsh unterstützen diese Syntax, aber es ist nicht POSIX), mit etwas Hilfe vom Kernel (muss es bieten /dev/fd: diffsieht so etwas wie /dev/fd/3auf der Kommandozeile).
Gilles

3
Es muss nicht bereitgestellt werden - Shells können auch für diese Funktion temporäre Named Pipes erstellen.
Ephemient

3
Das ist die coolste Antwort!
Neves

6
Ich persönlich bevorzuge diese Antwort. Ich musste zwei verschiedene XML-Dateien unterscheiden. aber sie mussten zuerst richtig geformt werden. Das führte dazu: diff -y <(xmllint --format "${1}") <(xmllint --format "${2}")was ich jetzt die ganze Zeit benutze.
Paul Nelson Baker

Dies ist auch unter OS X sehr nützlich, wo man zwei binäre .plist-Dateien vergleichen möchte:diff <(plutil -convert xml1 -o -- "${1}") <(plutil -convert xml1 -o - -- "${2}")
morgant

4

Piping in diff ist gleichbedeutend mit running

diff path/file.name

und dann, sobald es ausgeführt wird, den gesamten Inhalt der Datei eingeben.

Wie Sie sehen, haben Sie das nicht erwartet.


Kein Workaround? :(
user394

1
Schau dir Hemants Antwort an. Ich wusste nichts davon.
Macha

1
diff /tmp/localtempfile <(ssh -A -o StrictHostKeyChecking=no root@server "cat /tmp/remotetempfile")

Was ist mit der Senkung der Sicherheit StrictHostKeyChecking=no? Ansonsten eine gute Antwort.
Strg-Alt-Delor
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.