ฉันต้องทำrsync
โดยssh
และต้องการที่จะทำมันโดยอัตโนมัติโดยไม่จำเป็นต้องผ่านรหัสผ่านสำหรับssh
ตนเอง
ฉันต้องทำrsync
โดยssh
และต้องการที่จะทำมันโดยอัตโนมัติโดยไม่จำเป็นต้องผ่านรหัสผ่านสำหรับssh
ตนเอง
คำตอบ:
คุณควรใช้คีย์ไฟล์ที่ไม่มีข้อความรหัสผ่านสำหรับการเข้าสู่ระบบ ssh แบบสคริปต์ เห็นได้ชัดว่านี่เป็นความเสี่ยงด้านความปลอดภัยโปรดดูแลว่าไฟล์คีย์นั้นมีความปลอดภัยเพียงพอ
ssh -i
ควรเป็นไปได้เสมอในฝั่งลูกค้า คุณหมายความว่าเซิร์ฟเวอร์อาจไม่รองรับคีย์ทุกประเภท (เช่น ECDSA) ใช่หรือไม่ ไม่ว่าจะเป็นปัญหาใหญ่ ssh-keygen -t
แต่เพียงกรณีของการใช้ ฉันพลาดอะไรไปรึเปล่า?
rsync -e
และssh -i
.
ใช้ยูทิลิตี้ผู้ให้บริการรหัสผ่าน ssh แบบไม่โต้ตอบ "sshpass"
บน Ubuntu
sudo apt-get install sshpass
คำสั่ง 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 [...]
แต่ไม่ต้องการที่จะใส่รหัสผ่านในคำสั่งที่คุณสามารถเขียนมันเป็นไฟล์ชั่วคราวและรวมไว้เช่นนี้ จากนั้นปกป้อง.password
ไฟล์ของคุณโดยchmod 400 .password
ตรวจสอบให้แน่ใจว่ามีเพียงผู้ใช้ของคุณเท่านั้นที่สามารถอ่านได้
src_path
ควรเป็น server: path เช่น:server01.mydomain.local:/path/to/folder
-a
เปิด rsync รวมถึง-rlptgoD
คุณสามารถย่อคำสั่งดังนี้:rsync -az ...
คุณสามารถหลีกเลี่ยงพรอมต์รหัสผ่านบนrsync
คำสั่งโดยตั้งค่าตัวแปรสภาพแวดล้อมRSYNC_PASSWORD
เป็นรหัสผ่านที่คุณต้องการใช้หรือใช้--password-file
ตัวเลือก
หากคุณไม่สามารถใช้คีย์สาธารณะ / ส่วนตัวคุณสามารถใช้คาดหวัง:
#!/usr/bin/expect
spawn rsync SRC DEST
expect "password:"
send "PASS\n"
expect eof
if [catch wait] {
puts "rsync failed"
exit 1
}
exit 0
คุณจะต้องแทนที่ SRC และ DEST ด้วยพารามิเตอร์ต้นทาง rsync และปลายทางตามปกติและแทนที่ PASS ด้วยรหัสผ่านของคุณ ตรวจสอบให้แน่ใจว่าไฟล์นี้ถูกจัดเก็บอย่างปลอดภัย!
Red Hat Enterprise Linux Server release 5.11 (Tikanga)
ฉันทำให้มันทำงานดังนี้:
sshpass -p "password" rsync -ae "ssh -p remote_port_ssh" /local_dir remote_user@remote_host:/remote_dir
remote_port_ssh
ตั้งค่าเป็นอะไร? ดูเหมือนว่าตัวยึดสำหรับค่าจริง
ใช้คีย์ ssh
ดูและssh-keygen
ssh-copy-id
หลังจากนั้นคุณสามารถใช้rsync
วิธีนี้:
rsync -a --stats --progress --delete /home/path server:path
ความเป็นไปได้ที่น่าสนใจอีกประการหนึ่ง:
rsync --partial --progress --rsh = "ssh -i dsa_private_file" host_name @ โฮสต์: / home / me / d
หมายเหตุ: -i dsa_private_fileซึ่งเป็นคีย์ส่วนตัว RSA / DSA ของคุณ
โดยพื้นฐานแล้ววิธีการนี้คล้ายคลึงกับวิธีที่ @Mad Scientist อธิบายไว้มาก แต่คุณไม่จำเป็นต้องคัดลอกคีย์ส่วนตัวของคุณไปที่ ~ / .ssh กล่าวอีกนัยหนึ่งก็คือมีประโยชน์สำหรับงานเฉพาะกิจ (เข้าถึงครั้งเดียวโดยไม่ต้องใช้รหัสผ่าน)
สิ่งต่อไปนี้ใช้ได้กับฉัน:
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
ฉันต้องติดตั้ง sshpass
การป้อนรหัสผ่านโดยอัตโนมัติสำหรับคำสั่ง rsync เป็นเรื่องยาก วิธีง่ายๆของฉันเพื่อหลีกเลี่ยงปัญหาคือเมานต์โฟลเดอร์ที่จะสำรองข้อมูล จากนั้นใช้คำสั่ง rsync ในเครื่องเพื่อสำรองข้อมูลโฟลเดอร์ที่เมาท์
mount -t cifs //server/source/ /mnt/source-tmp -o username=Username,password=password
rsync -a /mnt/source-tmp /media/destination/
umount /mnt/source-tmp
แม้ว่าคุณจะนำไปใช้แล้วในตอนนี้
คุณยังสามารถใช้การใช้งานที่คาดหวังได้ (คุณจะพบทางเลือกอื่นใน Perl, Python: pexpect, paramiko เป็นต้น)
ฉันใช้ไฟล์ VBScript สำหรับการทำสิ่งนี้บนแพลตฟอร์ม Windows มันเซิร์ฟเวอร์ฉันเป็นอย่างดี
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}"
วิธีแก้ปัญหาอย่างเป็นทางการ (และอื่น ๆ ) ไม่สมบูรณ์เมื่อฉันเข้าเยี่ยมชมครั้งแรกฉันจึงกลับมาอีกหลายปีต่อมาเพื่อโพสต์วิธีการทางเลือกนี้ในกรณีที่มีคนอื่นมากระทบที่นี่โดยตั้งใจจะใช้คู่คีย์สาธารณะ / ส่วนตัว:
ดำเนินการนี้จากเครื่องสำรองข้อมูลเป้าหมายซึ่งดึงข้อมูลจากต้นทางไปยังข้อมูลสำรองเป้าหมาย
rsync -av --delete -e 'ssh -p 59333 -i /home/user/.ssh/id_rsa' user@10.9.9.3:/home/user/Server/ /home/keith/Server/
ดำเนินการจากเครื่องต้นทางซึ่งส่งจากแหล่งที่มาไปยังข้อมูลสำรองเป้าหมาย
rsync -av --delete -e 'ssh -p 59333 -i /home/user/.ssh/id_rsa' /home/user/Server/ user@10.9.9.3:/home/user/Server/
และหากคุณไม่ได้ใช้พอร์ตสำรองสำหรับ ssh ให้พิจารณาตัวอย่างที่สวยงามกว่าด้านล่าง:
ดำเนินการจากเครื่องสำรองข้อมูลเป้าหมายซึ่งดึงข้อมูลจากต้นทางไปยังข้อมูลสำรองเป้าหมาย:
sudo rsync -avi --delete user@10.9.9.3:/var/www/ /media/sdb1/backups/www/
ดำเนินการจากเครื่องต้นทางซึ่งส่งจากแหล่งที่มาไปยังการสำรองข้อมูลเป้าหมาย:
sudo rsync -avi --delete /media/sdb1/backups/www/ user@10.9.9.3:/var/www/
หากคุณยังคงได้รับแจ้งให้ใส่รหัสผ่านคุณจะต้องตรวจสอบการกำหนดค่า ssh ของคุณ/etc/ssh/sshd_config
และตรวจสอบว่าผู้ใช้ในแหล่งที่มาและเป้าหมายแต่ละคนมีคีย์ ssh สาธารณะของผู้อื่นโดยการส่งแต่ละครั้งด้วยssh-copy-id user@10.9.9.3
ประชาชนของผู้อื่นโดยการส่งแต่ละมากกว่าด้วย
(อีกครั้งนี่คือการใช้คู่คีย์ ssh โดยไม่ต้องใช้รหัสผ่านเป็นวิธีการอื่นและไม่ใช้สำหรับการส่งรหัสผ่านผ่านไฟล์)
ตามแนวคิดที่โพสต์โดย Andrew Seaford สิ่งนี้ทำได้โดยใช้ 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