Jak różnicować pliki / foldery na różnych komputerach, pod warunkiem że jedyną dostępną łącznością jest ssh?
Jak różnicować pliki / foldery na różnych komputerach, pod warunkiem że jedyną dostępną łącznością jest ssh?
Odpowiedzi:
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')
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 .
//
po remotehost
. Pojedynczy ukośnik nie zadziała
vimdiff /path/to/file scp://username@remotehost//path/to/file
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]"
Użyj scp, aby przenieść pliki na wspólną maszynę i tam je udostępnić?
Lub, jeśli chcesz tylko wiedzieć, czy pliki są 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.
rsync --dry-run
.
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 .
Możesz używać rsync
w 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 rvnc
opcji ( r
= rekurencyjny, v
= pełny, n
= suchy bieg, c
= suma kontrolna). W rsync
trybie 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ą.
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
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
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
http://myfedora.co.za/2012/04/diff-two-remote-file-systems/
diff <(/ usr / bin / ssh user1@192.168.122.1 'ls / opt / lib /') <(/ usr / bin / ssh user2@192.168.122.1 'ls / tmp /') | grep -i ">" | sed 's /> // g'
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
rsync -ani --delete / root@remotehost:/
ale zawiera więcej szczegółów.