Ssh üzerinde fark ne?


175

Kullanılabilir tek bağlantının ssh olması koşuluyla, dosyaları / klasörleri makinelere nasıl ayırabilirim?


8
# 16661'de nispeten benzer bir soru var : İki RedHat Linux sunucusunu nasıl ayırt edebilirim? . Buradaki cevap, tıklamaları kaydetmek için, rsync -ani --delete / root@remotehost:/ancak tam cevap daha fazla ayrıntı verir.
Owen Blacker

Burada oldukça fazla cevap var, fakat hangi yaklaşım daha hızlı?
pl1nk

1
Hiç kimse görsel fark araçlarını kullanmıyor mu?
Dan Dascalescu

Yanıtlar:


150

Bash'in işlem değişimi ile yapabilirsiniz :

 diff foo <(ssh myServer 'cat foo')

Veya, her ikisi de uzak sunuculardaysa:

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

12
evet, bunun gibi bir şey, ama dizinler için :)
Alexey Timanovsky

Dizinler için ne demek istiyorsun, her zaman kediyi ls ile değiştirebilir
Kyle Brandt

27
'Dizinler için' özyinelemeli bir fark yapmak anlamına geldiğinden şüpheliyim
Ian Clelland

9
Uzaktaki sunucum bir şifre isterse bu tekniğin benim için çalışmadığını öğrendim. Şifre istemi, yeniden yönlendirme ile iyi çalışmadı ve başarıyla tamamlanamadı. Eğer ssh anahtarlarını kullanıyorsanız bu bir problem olmamalıdır.
Adam Franco,

2
Bu, birçok sorun için harika bir genel çözümdür. 'Cat foo' yerine 'kullanabilirsiniz / find / foo / bar -type f | dosyayı okurken; echo "**** $ file"; kedi "$ dosya"; yapılır 've ayrılacak dosya adlarının ve dosya içeriğinin bir listesi olur.
Paul Gear

106

Sonunda harika bir çözüm buldum: vimdiff

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

sayesinde http://linux.spiney.org/remote_diff_with_vim_and_ssh ayrıca bkz http://www.vim.org/scripts/script.php?script_id=1075 .


7
Peki ya dizinler? :)
Perlnika,

1
İşte bir örnek: vimdiff .bash_profile scp: //vaibhavc@10.217.212.97//home/vaibhavc/.bash_profile
vaichidrewar

4
2 eğik çizgi //sonra remotehostönemlidir. Tek eğik çizgi işe yaramaz
Lee Chee Kiam

2
Uzak ana bilgisayarda geçerli ana makinenizden farklı bir kullanıcı adınız varsa, kullanırsınızvimdiff /path/to/file scp://username@remotehost//path/to/file
JaredC

Bunu, @JaredC @ id_rsa anahtar dosyalı iki uzak ana bilgisayarla nasıl yapabilirsiniz?
Manatax

61

Gerçek dosyaların bir farkı yerine hangi dosyaların farklı olduğunu görmek istiyorsanız, rsync --dry-run


10
rsync -n kısa versiyonudur.
volni

Harika - başka bir bağlantı noktasını kullanmanız gerekirse, rsync -e "ssh -p 2222" <SRC> <DST>
Samoth

16

İşte başka bir hızlı ve kirli komut satırı tarifi. Seçilen cevaptan farklı olarak, makefiles içinde çalışır:

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

Düzenlemem geçmezse: bu yöntem seçilen yanıttan üstündür çünkü makefiles ile çalışır.
Chris Redford

@ Steve Dickinson - "makefiles içinde çalışıyor" derken ne demek istiyorsun?
Martin Vegter

1
Benim gibi vim alerjiniz varsa bu da güzel bir çözüm. :) Aynı dosyayı iki farklı ana bilgisayarda karşılaştıran, hizmetleri makineler arasında taşırken ve config dosyalarını karşılaştırırken yararlı olan bir bash betiği oluşturdum. Bakınız gist.github.com/jhqv/dbd59f5838ae8c83f736bfe951bd80ff
Janek

10

Dosyaları ortak bir makineye getirmek ve orada dağıtmak için scp kullanın.

Sadece dosyaların bilmek istiyorum Ya da vardır , farklı ya da değil, her makinede md5sum ile karma.

SSHFS gibi bir şeye de bakabilirsiniz , ancak diff gibi bir algoritmanın bu konuda ne kadar iyi çalıştığını bilmiyorum.


2
Dosyaların farklı olup olmadığını görmek için kolay bir yoldur rsync --dry-run.
Gerald Combs

SSHFS'yi unutmuştum. Bu benim için harika çalıştı ...
arod

7

Bir şekilde, sisteminizde mümkünse, uzak dosya sistemini sshfs ile kolayca bağlamak olacaktır .


diff genellikle config farkını kontrol etmek gibi tek seferlik bir işlemdir. Dosya sisteminin her seferinde takılması mümkündür, ancak uygun değildir. Katranla alsam iyi olur.
Alexey Timanovsky

3

rsyncKuru çalışma modunda, başka bir cevapta kısaca önerildiği gibi kullanabilirsiniz . Farklı olan dosyaları listeler.

Bunun için rvncseçenekleri kullanın ( r= özyinelemeli, v= ayrıntılı, n= kuru çalışma, c= sağlama toplamı). İle rsyncçekme modda ( rsync [OPTION...] [USER@]HOST:SRC... [DEST]), bir örneği aşağıda verilmektedir:

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

Unutmayın , bu yerel veya uzak dosyanın daha yeni olup olmadığına dair hiçbir bilgi sağlamaz. Sadece farklılarsa.


2
  • Yerel makinenizde, değiştirmek istediğiniz dizinin özyinelemeli bir kopyasını alın. Örneğin:

    cp -R dir replica
    
  • uzak dizini yerel kopyaya kopyalamak için rsync kullanın:

     rsync remote:/path/to/dir replica
    
  • Uzaktaki yerel dizini ve yerel dizini arasındaki farkı bulmak için diff kullanın:

    diff dir replica
    

2

Eğer sshfs'leriniz varsa ve farklı dizinlere ihtiyacınız varsa:

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

1

İşte nasıl yaptım.

Uzak sunucuya SFTP kullandım ve istendiğinde kullanıcı adımı / pwd'yi girdim. Daha sonra, diff komutunda, ev dizinimdeki .gvfs dizininde oluşturulan dizini kullandım.

diff -r - özet / home / user dir / .gvfs / SFTP \ on \ freenas.local / dir / dir1 yoluna / yerel dir / dir2 yoluna


1

Bu, yerel klasör ve uzak klasörün dağılmasına yardımcı olabilecek bir komut dosyasıdır:

 #!/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

Ssh'ye monte edilmiş sshfs kullanın . Her şey o kadar hızlı olmayacak, ancak her şeyin yerel bir dosya sisteminde olmasını bekleyen tam araç setinizi kullanabilirsiniz. Bir alternatif "ssh -w" ile yapılan bir tünel üzerinden NFS'dir (veya ssh'nin sınırlama olmadığı diğer iletişimler).


1

Ayrıca yaklaşımı genelleştirmeyi de deneyebilirsiniz, muhtemelen ~ / .bashrc dosyasında bir bash işlevi oluşturabilirsiniz:

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

daha sonra şöyle bir yapıyla onu çağırmak:

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

Diff ile -s komutunu çağırmak, dosyaların aynı olup olmadığını bildirecektir.

Şerefe! Jim

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.