Nie możesz potokować do diff?

74

Chciałem być sprytny i porównać plik zdalny z plikiem lokalnym bez wcześniejszego ręcznego pobrania. Mogę pobrać zawartość pliku zdalnego przez

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

Jednak przesyłanie tego do diff

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

daje mi to:

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

Mam skonfigurowane klucze ssh, więc nie monituje mnie o hasło. Co to za obejście?

użytkownik394
źródło
5
Nawiasem mówiąc, nadal pobierasz plik, gdy to robisz (ponieważ jego zawartość jest wysyłana przez połączenie SSH), po prostu nie zapisujesz go nigdzie. Więc to nie tak, że oszczędzasz przepustowość lub coś takiego.
David Z
2
Tak, po prostu nie chcę zepsuć mojego systemu plików za pomocą plików jednorazowych.
user394,
1
bo gdy polecenie nie obsługuje standardowego wejścia (np. via -), możesz użyć /dev/stdin. np.diff file1 /dev/stdin
ctrl-alt-delor

Odpowiedzi:

92

Spróbuj użyć -do przedstawienia standardowego wejścia.

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

Hemant
źródło
przy porównywaniu gigantycznych plików (takich jak obrazy dysków linuksowych) jest to wysyłanie ich wszystkich do konsoli! nawet z diff -s (dla „same”) robi to.
user391339
65

Oto jedno obejście: diffwydaje się akceptować <( wyrażenie ) jako argumenty:

diff <(ssh \"cat path/file.name/") <(cat path/file.name)
użytkownik394
źródło
17
To nie jest różnica, to jest powłoka (bash, ksh i zsh obsługują tę składnię, ale to nie jest POSIX), z pewną pomocą jądra (musi dostarczyć /dev/fd: diffwidzi coś takiego /dev/fd/3w wierszu poleceń).
Gilles,
3
Nie „musi zapewniać” - powłoki mogą również tworzyć tymczasowe nazwane potoki dla tej funkcji.
efhemient
3
to najfajniejsza odpowiedź!
neves
6
Ja osobiście wolę tę odpowiedź. Musiałem różnicować dwa różne pliki XML; ale najpierw musiały zostać odpowiednio uformowane. Doprowadziło to do tego: diff -y <(xmllint --format "${1}") <(xmllint --format "${2}")którego teraz używam cały czas.
Paul Nelson Baker
Jest to również bardzo przydatne w systemie OS X, w którym można porównać dwa binarne pliki .plist:diff <(plutil -convert xml1 -o -- "${1}") <(plutil -convert xml1 -o - -- "${2}")
morgant
4

Pipowanie do diff jest równoważne z uruchomieniem

diff path/file.name

a następnie po uruchomieniu wpisuje całą zawartość pliku.

Jak widać, nie tego się spodziewałeś.

Macha
źródło
Brak obejścia? :(
user394,
1
Spójrz na odpowiedź Hemanta. Nie wiedziałem o jednym.
Macha,
1
diff /tmp/localtempfile <(ssh -A -o StrictHostKeyChecking=no root@server "cat /tmp/remotetempfile")
Michał Mrożek
źródło
Co jest z obniżeniem bezpieczeństwa StrictHostKeyChecking=no? W przeciwnym razie dobra odpowiedź.
ctrl-alt-delor