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.