Làm cách nào để chuyển mật khẩu tự động cho lệnh rsync SSH?


111

Tôi cần thực hiện rsyncbằng cách sshvà muốn thực hiện tự động mà không cần chuyển mật khẩu cho sshthủ công.

Câu trả lời:


44

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 đủ.

Hướng dẫn thiết lập truy cập ssh không mật khẩu


9
Không có khả năng đặt mật khẩu trong văn bản lệnh?
liysd

3
Không dễ dàng, không có tùy chọn cho nó trong ssh
Mad Scientist

Cần lưu ý rằng điều này không phải lúc nào cũng có thể thực hiện được (ví dụ: nhiều việc triển khai máy chủ ssh android khá hạn chế).
Ponkadoodle

@Ponkadoodle OP là về các yêu cầu phía máy khách, không phải phía máy chủ. ssh -inê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?
Jonathan H

1
Mặc dù ban đầu điều này có vẻ rắc rối nhưng đây là câu trả lời chính xác. Mật khẩu là thông tin nhạy cảm và những thông tin này không nên được lưu trữ rõ ràng hoặc sử dụng bất cẩn trong các chương trình. Đó là những gì các tập tin quan trọng; chỉ cần tìm hiểu về các tệp danh tính rsync -essh -i .
Jonathan H

94

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

4
Tôi biết đây không phải là phương pháp hay nhất, nhưng tôi đã có một NAS với SSHD bị hỏng sẽ không thực hiện xác thực dựa trên khóa. Câu trả lời này là mảnh ghép còn thiếu cho câu đố sao lưu tự động của tôi. Vì vậy, 1 cho câu trả lời cuối cùng-resort
Mike Gossmann

8
Nếu bạn không thể sử dụng một keyfile, nhưng không muốn để bao gồm mật khẩu trong lệnh, bạn có thể viết nó vào một tập tin tạm thời và bao gồm nó như thế này: sshpass -p`cat .password` ssh [...]. Sau đó, hãy bảo vệ .passwordtệ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.
lutuh

5
Để hoàn chỉnh, trong trường hợp của ssh'ing đến một máy chủ từ xa, src_pathnên được server: con đường, như vậy:server01.mydomain.local:/path/to/folder
harperville

đây chắc chắn là câu trả lời đúng! nó cho phép bạn viết kịch bản mà không cần ma thuật ssh, chỉ cần viết một kịch bản. ;) Kudos @Rajendra
genuinefafa

1
kể từ khi -achuyể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 ...
Jannie Theunissen

24

Bạn có thể tránh lời nhắc mật khẩu trên rsynclệnh bằng cách đặt biến môi trường RSYNC_PASSWORDthành mật khẩu bạn muốn sử dụng hoặc sử dụng --password-filetùy chọn.


41
chỉ hoạt động nếu máy chủ đích có rsync daemon chạy
Darryl Hebbes

4
Mặc dù câu trả lời này không hữu ích trừ khi sử dụng daemon rsync, Google đã đưa tôi đến đây và đó chính là thứ tôi cần. Đối với tôi, tôi cần rsync trực tiếp sang rsyncd, không cần ssh. Tôi vừa sử dụng tùy chọn tệp mật khẩu và hoạt động hoàn hảo cho một tập lệnh.
gregthegeek

14

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!


3
những lệnh arent sẵn trên của tôiRed Hat Enterprise Linux Server release 5.11 (Tikanga)
Để Kra

13

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

cái gì sẽ 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ế.
Max Williams

6

Sử dụng khóa ssh.

Nhìn vào ssh-keygenssh-copy-id.

Sau đó, bạn có thể sử dụng một rsynccách sau:

rsync -a --stats --progress --delete /home/path server:path

Nếu tôi sử dụng khóa với ssh, tôi viết: ssh u @ serv -i ./rsa Nhưng làm thế nào để làm điều đó trong rsync?
liysd

2
Nếu bạn đặt khóa vào thư mục .ssh của mình và đặt cho nó một tên chuẩn (thường là id_rsa / id_rsa.pub), nó sẽ được rsync chọn tự động.
Craig Trader vào

6

Một khả năng thú vị khác:

  1. tạo RSA hoặc cặp khóa DSA (như nó đã được mô tả)
  2. đặt khóa công khai cho máy chủ lưu trữ (như nó đã được mô tả)
  3. chạy:
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)


5

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


2
-a đã ngụ ý -rlptgoD và nói chung, sẽ hữu ích hơn nhiều nếu có một dòng lệnh giảm ở đây.
Christian

4

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

3

Mặc dù bây giờ bạn đã triển khai nó,

bạn cũng có thể sử dụng bất kỳ triển khai mong đợi nào (bạn sẽ tìm thấy các lựa chọn thay thế trong Perl, Python: pexpect, paramiko, v.v.)


2

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

2

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


Và một lưu ý quan trọng bên cạnh đó là trong ví dụ về cổng thay thế, bạn đang chuyển hướng ssh đến tệp khóa cá nhân của mình và khi nó thực thi lệnh trên đích, nó sẽ xác thực dựa trên khóa công khai của nó.
oemb1905

-1

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