it-swarm-vi.tech

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

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?

180
Alexey Timanovsky

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 .

108
Alexey Timanovsky

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

 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')
153
Kyle Brandt

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

62
Rory

Đâ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]"
16
Steve Dickinson

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 các tệp có khác 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.

10
Ian Clelland

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

7
Zoredache

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

Để làm điều đó, hãy sử dụng các tùy chọn rvnc (r = đệ quy, v = verbose, n = khô-chạy, c = checksum ). Với rsync ở chế độ kéo (rsync [OPTION...] [[email protected]]Host:SRC... [DEST]), một ví dụ là:

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

Hãy nhớ , đ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.

3
zzapper

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

mkdir remote_path
sshfs [email protected]:/path/ remote_path
diff -r path remote_path
2
metrix
  • 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
salva

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 hàm bash, có thể trong ~/.bashrc:

myrdiff() { ssh [email protected]"$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

1
Jim Swain

http://myfedora.co.za/2012/04/diff-two-remote-file-systems/

tìm khác biệt <(/ usr/bin/ssh grep -i ">" | sed 's /> // g'

1
Riaan

Đâ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
Peter

Đâ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 [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
1
stainless

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
Skaperen

sử dụng grep

remote ip: 172.16.98.130
remote file: /etc/ssh/keys-root/authorized_keys
local file: ~/.ssh/id_rsa.pub

Bây giờ so sánh nội dung của tệp từ xa với tệp cục bộ bằng cách sử dụng grep

grep -w "$(cat ~/.ssh/id_rsa.pub)" <<< $(sshpass -p "mypassword" ssh [email protected] 'cat /etc/ssh/keys-root/authorized_keys')

kiểm tra trạng thái thành công của lệnh grep

echo $?
# 0

Sử dụng ý tưởng này để thiết lập đăng nhập mật khẩu SSH:

if ! grep "$(cat ~/.ssh/id_rsa.pub)" <<< $(sshpass -p "mypassword" ssh [email protected] cat /etc/ssh/keys-root/authorized_keys) &>/dev/null; then
  cat ~/.ssh/id_rsa.pub | sshpass -p "mypassword" ssh [email protected] "cat >> /etc/ssh/keys-root/authorized_keys"
fi

ssh [email protected]

Lưu ý : Đảm bảo gói sshpass được cài đặt để chuyển mật khẩu không tương tác đến lệnh ssh.

0
Sathish