Làm thế nào để khác hơn ssh?


175

Làm cách nào để tôi tìm các tệp / thư mục khác nhau trên các máy với điều kiện là kết nối duy nhất có sẵn là ssh?


8
Có một câu hỏi tương đối giống nhau ở # 16661: Làm cách nào tôi có thể tìm hai máy chủ RedHat Linux? . Câu trả lời ở đó, để lưu các nhấp chuột, rsync -ani --delete / root@remotehost:/nhưng câu trả lời đầy đủ cung cấp chi tiết hơn.
Owen Blacker

Khá nhiều câu trả lời ở đây, nhưng cách tiếp cận nào nhanh hơn?
pl1nk

Câu trả lời:


150

Bạn có thể làm điều đó với quá trình thay thế của Bash :

 diff foo <(ssh myServer 'cat foo')

Hoặc, nếu cả hai đều trên máy chủ từ xa:

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

12
vâng, một cái gì đó như thế này, nhưng cho các thư mục :)
Alexey Timanovsky

Làm thế nào để bạn có ý nghĩa cho các thư mục, luôn có thể thay thế con mèo bằng ls
Kyle Brandt

27
Tôi nghi ngờ rằng 'cho các thư mục' có nghĩa là thực hiện một đệ quy khác
Ian Clelland

9
Tôi thấy rằng kỹ thuật này không hiệu quả với tôi nếu máy chủ từ xa của tôi yêu cầu mật khẩu. Dấu nhắc mật khẩu dường như không hoạt động tốt với chuyển hướng và không thể hoàn thành thành công. Nếu bạn sử dụng các phím ssh thì đây không phải là vấn đề.
Adam Franco

2
Đây là một giải pháp chung tuyệt vời cho nhiều vấn đề. Thay vì 'cat foo', bạn có thể sử dụng 'find / foo / bar -type f | trong khi đọc tập tin; làm tiếng vang "**** $ file"; mèo "tập tin $"; xong 'và bạn sẽ có một danh sách tên tệp và nội dung tệp để tìm khác biệt.
Paul Gear

106

Cuối cùng tôi đã tìm thấy giải pháp tuyệt vời: vimdiff

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

cảm ơn http://linux.spiney.org/remote_diff_with_vim_and_ssh xem thêm http://www.vim.org/scripts/script.php?script_id=1075 .


7
Còn thư mục thì sao? :)
Perlnika 16/12/13

1
Dưới đây là một ví dụ: vimdiff .bash_profile scp: //vaibhavc@10.217.212.97//home/vaibhavc/.bash_profile
vaichidrewar

4
2 dấu gạch chéo //sau remotehostlà quan trọng. Độc dấu gạch chéo sẽ không làm việc
Lee Chee kiam

2
Nếu bạn có tên người dùng khác trên máy chủ từ xa so với máy chủ hiện tại, bạn sẽ sử dụngvimdiff /path/to/file scp://username@remotehost//path/to/file
JaredC

Làm thế nào bạn có thể làm điều này với hai máy chủ từ xa với các tệp khóa id_rsa @JaredC?
Manatax

61

Nếu bạn chỉ muốn xem các tệp nào khác nhau, thay vì khác với các tệp thực tế, thì bạn có thể sử dụng rsync --dry-run


10
rsync -n là phiên bản ngắn.
volni

Tuyệt vời - nếu bạn cần sử dụng một cổng khác, hãy sử dụng rsync -e "ssh -p 2222" <SRC> <DST>
Samoth

16

Đây là một công thức dòng lệnh nhanh và bẩn. Không giống như câu trả lời được chọn, nó hoạt động bên trong makefiles:

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

Nếu chỉnh sửa của tôi không được thực hiện: phương pháp này vượt trội hơn câu trả lời đã chọn vì nó hoạt động với tệp tạo tệp.
Chris Redford

@Steve Dickinson - ý của bạn là "nó hoạt động bên trong makefiles"?
Martin Vegter

1
Đây cũng là một giải pháp tốt nếu bạn bị dị ứng vim như tôi. :) Tôi đã tạo một tập lệnh bash so sánh cùng một tệp trên hai máy chủ khác nhau, hữu ích khi di chuyển dịch vụ giữa các máy và so sánh các tệp cấu hình. Xem gist.github.com/jhqv/dbd59f5838ae8c83f736bfe951bd80ff
Janek

10

Sử dụng scp để đưa các tập tin vào một máy chung và khác chúng ở đó?

Hoặc, nếu bạn chỉ muốn biết liệu các tệp khác nhau hay không, hãy băm chúng với md5sum trên mỗi máy.

Bạn cũng có thể xem xét một cái gì đó như SSHFS , nhưng tôi không biết thuật toán như diff thực hiện tốt như thế nào.


2
Một cách dễ dàng hơn để xem các tập tin có khác nhau hay không rsync --dry-run.
Gerald Combs

Tôi đã quên về SSHFS. Điều này làm việc rất tốt cho tôi ...
arod

7

Một cách, nếu có thể trên hệ thống của bạn sẽ chỉ đơn giản là gắn hệ thống tập tin từ xa với sshfs .


khác thường là hành động một shot, muốn kiểm tra sự khác biệt cấu hình. Gắn hệ thống tập tin mỗi lần là có thể, nhưng không thuận tiện. Tôi tốt hơn tar và scp.
Alexey Timanovsky

3

Bạn có thể sử dụng rsynctrong chế độ chạy khô, như được đề xuất ngắn gọn trong một câu trả lời khác . Nó liệt kê bất kỳ tập tin nào khác nhau.

Đối với điều đó, sử dụng các rvnctùy chọn ( r= đệ quy, v= verbose, n= khô-run, c= checksum). Với rsyncchế độ kéo ( rsync [OPTION...] [USER@]HOST:SRC... [DEST]), một ví dụ là:

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

Hãy nhớ rằng , điều này không cung cấp thông tin về việc tệp cục bộ hay tệp từ xa mới hơn. Chỉ cần họ khác nhau.


2
  • trên máy cục bộ của bạn, tạo một bản sao đệ quy của thư mục bạn muốn tìm khác biệt. Ví dụ:

    cp -R dir replica
    
  • sử dụng rsync để sao chép thư mục từ xa qua bản sao cục bộ:

     rsync remote:/path/to/dir replica
    
  • sử dụng diff để tìm sự khác biệt giữa thư mục cục bộ và bản sao cục bộ của từ xa:

    diff dir replica
    

2

Nếu bạn có sshfs và cần thư mục khác:

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

1

Đây là cách tôi đã làm nó.

Tôi đã sử dụng SFTP đến máy chủ từ xa và nhập tên người dùng / pwd của mình khi được nhắc. Sau đó, tôi đã sử dụng thư mục được tạo trong thư mục .gvfs trong thư mục chính của tôi trong lệnh diff.

diff -r --brief / home / user dir / .gvfs / SFTP \ on \ freenas.local / đường dẫn đến dir / dir1 / đường dẫn đến dir / dir2 cục bộ


1

Đây là một tập lệnh có thể giúp khác biệt thư mục cục bộ và thư mục từ xa.:

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

Sử dụng sshfs gắn trên ssh. Sẽ không nhanh như vậy, nhưng bạn có thể sử dụng bộ công cụ đầy đủ của mình, hy vọng mọi thứ sẽ nằm trên một hệ thống tệp cục bộ. Một cách khác là NFS trên một đường hầm được tạo bằng "ssh -w" (hoặc các thông tin liên lạc khác trong đó ssh không phải là giới hạn).


1

Bạn cũng có thể thử khái quát hóa cách tiếp cận bằng cách tạo một hàm bash, có thể trong ~ / .bashrc:

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

sau đó gọi nó với một cấu trúc như:

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

Bằng cách gọi diff với -s, điều này cũng sẽ báo cáo nếu các tệp giống hệt nhau.

Chúc mừng! Jim

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.