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?

user394
quelle
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 -

Hemant
quelle
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)
user394
quelle
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.

Macha
quelle
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")
Michael Mrozek
quelle
Was ist mit der Senkung der Sicherheit StrictHostKeyChecking=no? Ansonsten eine gute Antwort.
Strg-Alt-Delor