Jak różnią się od ssh?


175

Jak różnicować pliki / foldery na różnych komputerach, pod warunkiem że jedyną dostępną łącznością jest ssh?


8
Stosunkowo podobne pytanie jest na # 16661: Jak mogę różnicować dwa serwery RedHat Linux? . Odpowiedź na to pytanie, aby zapisać kliknięcia, jest pełna , rsync -ani --delete / root@remotehost:/ale zawiera więcej szczegółów.
Owen Blacker

Dość wiele odpowiedzi tutaj, ale które podejście jest szybsze?
pl1nk

Odpowiedzi:


150

Możesz to zrobić z podstawieniem procesu Basha :

 diff foo <(ssh myServer 'cat foo')

Lub, jeśli oba są na zdalnych serwerach:

diff <(ssh myServer1 'cat foo') <(ssh myServer2 'cat foo')

12
tak, coś takiego, ale dla katalogów :)
Alexey Timanovsky

Co masz na myśli dla katalogów, zawsze może zastąpić kota ls
Kyle Brandt

27
Podejrzewam, że „dla katalogów” oznacza robienie rekurencyjnego diff
Ian Clelland

9
Odkryłem, że ta technika nie działa dla mnie, jeśli mój zdalny host wymaga hasła. Monit o hasło nie działał dobrze z przekierowaniem i nie mógł zostać pomyślnie zakończony. Jeśli używasz kluczy ssh, nie powinno to stanowić problemu.
Adam Franco

2
To świetne ogólne rozwiązanie wielu problemów. Zamiast „cat foo” można użyć „find / foo / bar -type f | podczas odczytu pliku; wykonaj echo „**** $ plik”; cat „$ file”; gotowe ”, a będziesz mieć listę nazw plików i zawartości plików do różnic.
Paul Gear

106

Wreszcie znalazłem świetne rozwiązanie: vimdiff

vimdiff /path/to/file scp://remotehost//path/to/file

dzięki http://linux.spiney.org/remote_diff_with_vim_and_ssh patrz również http://www.vim.org/scripts/script.php?script_id=1075 .


7
Co z katalogami? :)
Perlnika,

1
Oto przykład: vimdiff .bash_profile scp: //vaibhavc@10.217.212.97//home/vaibhavc/.bash_profile
vaichidrewar

4
Ważne są 2 kreski //po remotehost. Pojedynczy ukośnik nie zadziała
Lee Chee Kiam

2
Jeśli masz inną nazwę użytkownika na hoście zdalnym niż obecny, vimdiff /path/to/file scp://username@remotehost//path/to/file
użyłbyś

jak możesz to zrobić za pomocą dwóch zdalnych hostów z plikami kluczy id_rsa @JaredC?
Manatax,

61

Jeśli chcesz zobaczyć, które pliki są różne, a nie różnicę rzeczywistych plików, możesz użyć rsync --dry-run


10
rsync -n to krótka wersja.
volni

Świetnie - jeśli potrzebujesz użyć innego portu, użyj rsync -e "ssh -p 2222" <SRC> <DST>
Samoth

16

Oto kolejny szybki i brudny przepis w wierszu poleceń. W przeciwieństwie do wybranej odpowiedzi, działa wewnątrz plików makefiles:

ssh [login]@[host] "cat [remote file]" | diff - "[local file]"

Jeśli moja edycja nie przejdzie: ta metoda jest lepsza niż wybrana odpowiedź, ponieważ działa z plikami makefiles.
Chris Redford,

@ Steve Dickinson - co rozumiesz przez „to działa w plikach makefiles”?
Martin Vegter

1
Jest to również dobre rozwiązanie, jeśli cierpisz na alergię vim jak ja. :) Stworzyłem skrypt bash, który porównuje ten sam plik na dwóch różnych hostach, przydatny podczas migracji usług między komputerami i porównywania plików konfiguracyjnych. Zobacz gist.github.com/jhqv/dbd59f5838ae8c83f736bfe951bd80ff
Janek

10

Użyj scp, aby przenieść pliki na wspólną maszynę i tam je udostępnić?

Lub, jeśli chcesz tylko wiedzieć, czy pliki różne, czy nie, hasz je za pomocą md5sum na każdym komputerze.

Możesz także spojrzeć na coś takiego jak SSHFS , ale nie wiem, jak dobrze algorytm taki jak diff działa w tym zakresie.


2
Łatwiejszym sposobem sprawdzenia, czy pliki są różne, czy nie rsync --dry-run.
Gerald Combs

Zapomniałem o SSHFS.
Działa to

7

Jednym ze sposobów, jeśli jest to możliwe w twoim systemie, byłoby po prostu zamontowanie zdalnego systemu plików za pomocą sshfs .


diff jest zwykle działaniem jednorazowym, na przykład w celu sprawdzenia różnicy konfiguracji. Montowanie systemu plików za każdym razem jest możliwe, ale niezbyt wygodne. Lepiej tar i scp.
Aleksiej Timanowskij

3

Możesz używać rsyncw trybie pracy na sucho, jak to krótko sugerowano w innej odpowiedzi . Zawiera listę wszystkich plików, które są różne.

W tym celu skorzystaj z rvncopcji ( r= rekurencyjny, v= pełny, n= suchy bieg, c= suma kontrolna). W rsynctrybie pull ( rsync [OPTION...] [USER@]HOST:SRC... [DEST]) przykładem jest:

rsync -rvnc root@182.18.158.207:/var/www/html/dev/ .

Pamiętaj , że nie zawiera to informacji o tym, czy plik lokalny czy zdalny jest nowszy. Tylko jeśli się różnią.


2
  • na komputerze lokalnym zrób rekurencyjną kopię katalogu, który chcesz różnicować. Na przykład:

    cp -R dir replica
    
  • użyj rsync do zreplikowania katalogu zdalnego na kopii lokalnej:

     rsync remote:/path/to/dir replica
    
  • użyj diff, aby znaleźć różnicę między katalogiem lokalnym a lokalną repliką zdalnego:

    diff dir replica
    

2

Jeśli masz sshfs i potrzebujesz różnicować katalogi:

mkdir remote_path
sshfs user@host:/path/ remote_path
diff -r path remote_path

1

Oto jak to zrobiłem.

Użyłem SFTP do zdalnego serwera i po wyświetleniu monitu wprowadziłem nazwę użytkownika / pwd. Następnie użyłem katalogu, który został utworzony w katalogu .gvfs w moim katalogu domowym w poleceniu diff.

diff -r --brief / home / user dir / .gvfs / SFTP \ on \ freenas.local / path to dir / dir1 / path to local dir / dir2


1

To jest skrypt, który może pomóc w różnicowaniu folderów lokalnych i folderów zdalnych:

 #!/bin/bash

 LOCALFOLDER=/var/www/tee
 REMOTEFOLDER=$(ssh root@111.111.111.1 'ls -lA /hfs/tee'| grep -E '^total' | cut -d " " -f 2 > remotessh.txt)
 COMMAND=$(ls -lA $LOCALFOLDER | grep -E '^total' | cut -d " " -f 2 > localssh.txt)
 REM=$(cat remotessh.txt)
 LOCAL=$(cat localssh.txt)

 echo $LOCAL
 echo $REM

 if [ $REM -eq $LOCAL ]
 then
      echo Directories are the same
 else
      echo Directories are differnt
 fi

 #diff localssh.txt remotessh.txt | grep -E '^total' | cut -d " " -f 2


1

Użyj sshfs zamontowanego w ssh. Nie będzie tak szybko, ale możesz użyć pełnego zestawu narzędzi, które oczekują, że wszystko będzie w lokalnym systemie plików. Alternatywą jest NFS w tunelu wykonanym za pomocą „ssh -w” (lub innej komunikacji, w której ssh nie jest ograniczeniem).


1

Możesz także spróbować uogólnić to podejście, tworząc funkcję bash, prawdopodobnie w twoim ~ / .bashrc:

myrdiff() { ssh root@"$1" cat "$2" | diff -s - "$2" ; }

następnie wywołując go za pomocą konstrukcji takiej jak:

myrdiff vm20-x86-64 /etc/gdm/Init/Default

Wywołanie diff z opcją -s spowoduje również zgłoszenie, czy pliki są identyczne.

Twoje zdrowie! Jim

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.