Bagaimana perbedaan dari ssh?

175

Bagaimana cara membedakan file / folder di mesin dengan ketentuan bahwa satu-satunya konektivitas yang tersedia adalah ssh?

Alexey Timanovsky
sumber
8
Ada pertanyaan yang relatif sama di # 16661: Bagaimana saya bisa membedakan dua server RedHat Linux? . Jawaban di sana, untuk menyimpan klik, rsync -ani --delete / root@remotehost:/tetapi jawaban lengkapnya memberikan lebih banyak detail.
Owen Blacker
Cukup banyak jawaban di sini, tetapi pendekatan mana yang lebih cepat?
pl1nk
1
Tidak ada yang menggunakan alat diff visual ?
Dan Dascalescu

Jawaban:

150

Anda dapat melakukannya dengan substitusi proses Bash :

 diff foo <(ssh myServer 'cat foo')

Atau, jika keduanya ada di server jarak jauh:

diff <(ssh myServer1 'cat foo') <(ssh myServer2 'cat foo')
Kyle Brandt
sumber
12
yeah, sesuatu seperti ini, tetapi untuk direktori :)
Alexey Timanovsky
Bagaimana maksud Anda untuk direktori, selalu bisa mengganti kucing dengan ls
Kyle Brandt
27
Saya menduga bahwa 'untuk direktori' berarti melakukan perbedaan rekursif
Ian Clelland
9
Saya menemukan bahwa teknik ini tidak berfungsi untuk saya jika host jarak jauh saya memerlukan kata sandi. Prompt kata sandi tampaknya tidak berfungsi dengan baik untuk pengalihan dan tidak dapat diselesaikan dengan sukses. Jika Anda menggunakan kunci ssh ini seharusnya tidak menjadi masalah.
Adam Franco
2
Ini adalah solusi umum yang bagus untuk banyak masalah. Alih-alih 'cat foo' Anda bisa menggunakan 'find / foo / bar -type f | saat membaca file; lakukan gema "**** $ file"; cat "$ file"; selesai 'dan Anda akan memiliki daftar nama file dan isi file berbeda.
Paul Gear
106

Akhirnya saya menemukan solusi hebat: vimdiff

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

terima kasih kepada http://linux.spiney.org/remote_diff_with_vim_and_ssh lihat juga http://www.vim.org/scripts/script.php?script_id=1075 .

Alexey Timanovsky
sumber
7
Bagaimana dengan direktori? :)
Perlnika
1
Berikut ini sebuah contoh: vimdiff .bash_profile scp: //[email protected]//home/vaibhavc/.bash_profile
vaichidrewar
4
2 garis miring //setelah remotehostitu penting. Slash tunggal tidak akan berfungsi
Lee Chee Kiam
2
Jika Anda memiliki nama pengguna yang berbeda pada host jarak jauh dari host Anda saat ini, Anda akan menggunakanvimdiff /path/to/file scp://username@remotehost//path/to/file
JaredC
bagaimana Anda bisa melakukan ini dengan dua host jarak jauh dengan file kunci id_rsa @ JaredC?
Manatax
61

Jika Anda hanya ingin melihat file apa yang berbeda, daripada berbeda dari file yang sebenarnya, maka Anda dapat menggunakannya rsync --dry-run

Rory
sumber
10
rsync -n adalah versi singkat.
volni
Hebat - jika Anda perlu menggunakan port lain, gunakan rsync -e "ssh -p 2222" <SRC> <DST>
Samoth
16

Inilah resep baris perintah cepat dan kotor lainnya. Berbeda dengan jawaban yang dipilih, ia bekerja di dalam makefiles:

ssh [login]@[host] "cat [remote file]" | diff - "[local file]"
Steve Dickinson
sumber
Jika edit saya tidak melalui: metode ini lebih unggul daripada jawaban yang dipilih karena ini bekerja dengan makefiles.
Chris Redford
@Steve Dickinson - apa yang Anda maksud dengan "itu bekerja di dalam makefiles"?
Martin Vegter
1
Ini juga solusi yang bagus jika Anda menderita alergi vim seperti saya. :) Saya membuat skrip bash yang membandingkan file yang sama pada dua host yang berbeda, berguna saat memigrasi layanan antar mesin dan membandingkan file konfigurasi. Lihat gist.github.com/jhqv/dbd59f5838ae8c83f736bfe951bd80ff
Janek
10

Gunakan scp untuk membawa file ke mesin umum dan diff mereka di sana?

Atau, jika Anda hanya ingin tahu apakah file tersebut berbeda atau tidak, hash dengan md5sum di setiap mesin.

Anda juga bisa melihat ke sesuatu seperti SSHFS , tapi saya tidak tahu seberapa baik algoritma seperti diff melakukan lebih dari itu.

Ian Clelland
sumber
2
Cara yang lebih mudah untuk melihat apakah file berbeda atau tidak rsync --dry-run.
Gerald Combs
Saya lupa tentang SSHFS. Ini bekerja sangat baik untuk saya ...
arod
7

Salah satu caranya, jika mungkin pada sistem Anda adalah dengan hanya me-mount sistem file jarak jauh dengan sshfs .

Sakit kepala
sumber
diff biasanya merupakan tindakan satu-shot, seperti memeriksa perbedaan konfigurasi. Memasang sistem file setiap kali dimungkinkan, tetapi tidak nyaman. Lebih baik saya tar dan scp.
Alexey Timanovsky
3

Anda dapat menggunakan rsyncdalam mode lari kering, seperti yang disarankan secara singkat di jawaban lain . Ini mencantumkan file yang berbeda.

Untuk itu, gunakan rvncopsi ( r= rekursif, v= verbose, n= dry-run, c= checksum). Dengan rsyncdalam mode tarik ( rsync [OPTION...] [USER@]HOST:SRC... [DEST]), contohnya adalah:

rsync -rvnc [email protected]:/var/www/html/dev/ .

Ingat , ini tidak memberikan info apakah file lokal atau jauh lebih baru. Hanya jika mereka berbeda.

zzapper
sumber
2
  • pada mesin lokal Anda, buat salinan rekursif dari direktori yang ingin Anda bedakan. Misalnya:

    cp -R dir replica
    
  • gunakan rsync untuk mereplikasi direktori jarak jauh melalui salinan lokal:

     rsync remote:/path/to/dir replica
    
  • gunakan diff untuk menemukan perbedaan antara direktori lokal dan replika lokal dari yang jauh:

    diff dir replica
    
salva
sumber
2

Jika Anda memiliki sshfs dan perlu membedakan direktori:

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

Inilah cara saya melakukannya.

Saya menggunakan SFTP ke server jarak jauh dan memasukkan nama pengguna / sandi saya saat diminta. Kemudian saya menggunakan direktori yang dibuat di direktori .gvfs di direktori home saya di perintah diff.

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

Peter
sumber
1

Ini adalah skrip yang dapat membantu membedakan folder lokal dan folder jauh .:

 #!/bin/bash

 LOCALFOLDER=/var/www/tee
 REMOTEFOLDER=$(ssh [email protected] '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
tahan karat
sumber
1

Gunakan sshfs yang dipasang di ssh. Tidak akan secepat itu, tetapi Anda dapat menggunakan perangkat lengkap yang mengharapkan semuanya berada pada sistem file lokal. Alternatifnya adalah NFS di atas terowongan yang dibuat dengan "ssh -w" (atau komunikasi lain di mana ssh bukan batasannya).

Skaperen
sumber
1

Anda juga dapat mencoba menggeneralisasi pendekatan dengan membuat fungsi bash, mungkin di ~ / .bashrc Anda:

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

kemudian memohonnya dengan konstruk seperti:

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

Dengan menggunakan diff dengan -s, ini juga akan melaporkan jika file identik.

Tepuk tangan! Jim

Jim Swain
sumber