Câu trả lời:
Bạn nên sử dụng tệp khóa không có cụm mật khẩu cho đăng nhập ssh có tập lệnh. Đây rõ ràng là một rủi ro bảo mật, hãy cẩn thận rằng bản thân keyfile đã được bảo mật đầy đủ.
ssh -i
nên luôn luôn có thể ở phía khách hàng. Ý của bạn là máy chủ có thể không hỗ trợ tất cả các loại khóa (ví dụ: ECDSA)? Đó sẽ không phải là một vấn đề lớn, chỉ là một trường hợp sử dụng ssh-keygen -t
. Tui bỏ lỡ điều gì vậy?
rsync -e
vàssh -i
.
Sử dụng tiện ích cung cấp mật khẩu ssh không tương tác "sshpass"
Trên Ubuntu
sudo apt-get install sshpass
Lệnh để rsync
/usr/bin/rsync -ratlz --rsh="/usr/bin/sshpass -p password ssh -o StrictHostKeyChecking=no -l username" src_path dest_path
sshpass -p`cat .password` ssh [...]
. Sau đó, hãy bảo vệ .password
tệp của bạn bằng cách chmod 400 .password
đảm bảo rằng chỉ người dùng của bạn mới có thể đọc được.
src_path
nên được server: con đường, như vậy:server01.mydomain.local:/path/to/folder
-a
chuyển đổi trên rsync bao gồm -rlptgoD
, bạn có thể rút ngắn thời lệnh như thế này:rsync -az ...
Bạn có thể tránh lời nhắc mật khẩu trên rsync
lệnh bằng cách đặt biến môi trường RSYNC_PASSWORD
thành mật khẩu bạn muốn sử dụng hoặc sử dụng --password-file
tùy chọn.
Nếu bạn không thể sử dụng khóa công khai / riêng tư, bạn có thể sử dụng mong đợi:
#!/usr/bin/expect
spawn rsync SRC DEST
expect "password:"
send "PASS\n"
expect eof
if [catch wait] {
puts "rsync failed"
exit 1
}
exit 0
Bạn sẽ cần thay thế SRC và DEST bằng các tham số nguồn và đích rsync thông thường của mình, đồng thời thay thế PASS bằng mật khẩu của bạn. Chỉ cần đảm bảo rằng tệp này được lưu trữ an toàn!
Red Hat Enterprise Linux Server release 5.11 (Tikanga)
Tôi đã làm cho nó hoạt động như thế này:
sshpass -p "password" rsync -ae "ssh -p remote_port_ssh" /local_dir remote_user@remote_host:/remote_dir
remote_port_ssh
được đặt thành? Nó trông giống như một trình giữ chỗ cho một giá trị thực tế.
Sử dụng khóa ssh.
Nhìn vào ssh-keygen
và ssh-copy-id
.
Sau đó, bạn có thể sử dụng một rsync
cách sau:
rsync -a --stats --progress --delete /home/path server:path
Một khả năng thú vị khác:
rsync --partial --progress --rsh = "ssh -i dsa_private_file" host_name @ host: / home / me / d.
Lưu ý: -i dsa_private_file là khóa cá nhân RSA / DSA của bạn
Về cơ bản, cách tiếp cận này rất giống với cách được @Mad Scientist mô tả, tuy nhiên bạn không cần phải sao chép khóa cá nhân của mình vào ~ / .ssh. Nói cách khác, nó hữu ích cho các tác vụ đặc biệt (truy cập một lần không cần mật khẩu)
Những điều sau đây phù hợp với tôi:
SSHPASS='myPassword'
/usr/bin/rsync -a -r -p -o -g --progress --modify-window=1 --exclude /folderOne -s -u --rsh="/usr/bin/sshpass -p $SSHPASS ssh -o StrictHostKeyChecking=no -l root" source-path myDomain:dest-path >&2
Tôi đã phải cài đặt sshpass
Tự động nhập mật khẩu cho lệnh rsync rất khó. Giải pháp đơn giản của tôi để tránh sự cố là gắn kết thư mục cần sao lưu. Sau đó, sử dụng lệnh rsync cục bộ để sao lưu thư mục được gắn kết.
mount -t cifs //server/source/ /mnt/source-tmp -o username=Username,password=password
rsync -a /mnt/source-tmp /media/destination/
umount /mnt/source-tmp
Tôi sử dụng tệp VBScript để thực hiện việc này trên nền tảng Windows, nó phục vụ tôi rất tốt.
set shell = CreateObject("WScript.Shell")
shell.run"rsync -a Name@192.168.1.100:/Users/Name/Projects/test ."
WScript.Sleep 100
shell.SendKeys"Your_Password"
shell.SendKeys "{ENTER}"
Giải pháp chính thức (và những giải pháp khác) không hoàn chỉnh khi tôi truy cập lần đầu tiên, vì vậy, nhiều năm sau tôi quay lại để đăng phương pháp thay thế này trong trường hợp bất kỳ người nào khác ở đây có ý định sử dụng cặp khóa công khai / riêng tư:
Thực thi điều này từ máy sao lưu đích, máy này kéo từ nguồn sang sao lưu đích
rsync -av --delete -e 'ssh -p 59333 -i /home/user/.ssh/id_rsa' user@10.9.9.3:/home/user/Server/ /home/keith/Server/
Thực thi điều này từ máy nguồn, máy sẽ gửi từ nguồn đến bản sao lưu đích
rsync -av --delete -e 'ssh -p 59333 -i /home/user/.ssh/id_rsa' /home/user/Server/ user@10.9.9.3:/home/user/Server/
Và, nếu bạn không sử dụng cổng thay thế cho ssh, thì hãy xem xét các ví dụ thanh lịch hơn bên dưới:
Thực thi điều này từ máy sao lưu đích, máy này kéo từ nguồn sang sao lưu đích:
sudo rsync -avi --delete user@10.9.9.3:/var/www/ /media/sdb1/backups/www/
Thực thi điều này từ máy nguồn, máy sẽ gửi từ nguồn đến bản sao lưu đích:
sudo rsync -avi --delete /media/sdb1/backups/www/ user@10.9.9.3:/var/www/
Nếu bạn vẫn được nhắc nhập mật khẩu, thì bạn cần kiểm tra cấu hình ssh của mình /etc/ssh/sshd_config
và xác minh rằng những người dùng trong nguồn và mục tiêu đều có khóa ssh công khai tương ứng của những người khác bằng cách gửi từng người dùng ssh-copy-id user@10.9.9.3
.
(Một lần nữa, điều này là để sử dụng cặp khóa ssh mà không có mật khẩu, như một cách tiếp cận thay thế, và không phải để chuyển mật khẩu qua tệp.)
Theo ý tưởng được đăng bởi Andrew Seaford, điều này được thực hiện bằng sshfs:
echo "SuperHardToGuessPass:P" | sshfs -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no user@example.com:/mypath/ /mnt/source-tmp/ -o workaround=rename -o password_stdin
rsync -a /mnt/source-tmp/ /media/destination/
umount /mnt/source-tmp