Bagaimana perbedaan dari ssh?


175

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


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')

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 .


7
Bagaimana dengan direktori? :)
Perlnika

1
Berikut ini sebuah contoh: vimdiff .bash_profile scp: //vaibhavc@10.217.212.97//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


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]"

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.


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 .


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 root@182.18.158.207:/var/www/html/dev/ .

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


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
    

2

Jika Anda memiliki sshfs dan perlu membedakan direktori:

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

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


1

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

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

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).


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.