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?
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 .
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')
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
Đâ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]"
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.
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 .
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.
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
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
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
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'
Đâ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ộ
Đâ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
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).
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
.