จะส่งรหัสผ่านโดยอัตโนมัติสำหรับคำสั่ง rsync SSH ได้อย่างไร


111

ฉันต้องทำrsyncโดยsshและต้องการที่จะทำมันโดยอัตโนมัติโดยไม่จำเป็นต้องผ่านรหัสผ่านสำหรับsshตนเอง


วิธีที่ง่ายที่สุดในการแจ้งรหัสผ่าน pypass ทุกครั้งที่คุณโอนหรือเข้าสู่ระบบ ssh ของคุณคือการสร้างรหัสนี่คือวิธีที่คุณสามารถทำได้ใน 2 ขั้นตอนbrightery.com/th/post/…
มูฮัมหมัดเอล - ซาอีด

คำตอบ:


44

คุณควรใช้คีย์ไฟล์ที่ไม่มีข้อความรหัสผ่านสำหรับการเข้าสู่ระบบ ssh แบบสคริปต์ เห็นได้ชัดว่านี่เป็นความเสี่ยงด้านความปลอดภัยโปรดดูแลว่าไฟล์คีย์นั้นมีความปลอดภัยเพียงพอ

คำแนะนำสำหรับการตั้งค่าการเข้าถึง ssh แบบไม่ใช้รหัสผ่าน


9
ไม่มีความเป็นไปได้ในการใส่รหัสผ่านในข้อความคำสั่ง?
liysd

3
ไม่ง่ายไม่มีตัวเลือกสำหรับมันใน ssh
Mad Scientist

ควรสังเกตว่าสิ่งนี้ไม่สามารถทำได้เสมอไป (เช่นการใช้งานเซิร์ฟเวอร์ android ssh จำนวนมากค่อนข้าง จำกัด )
Ponkadoodle

@Ponkadoodle OP เป็นเรื่องเกี่ยวกับคำขอฝั่งไคลเอ็นต์ไม่ใช่ฝั่งเซิร์ฟเวอร์ ssh -iควรเป็นไปได้เสมอในฝั่งลูกค้า คุณหมายความว่าเซิร์ฟเวอร์อาจไม่รองรับคีย์ทุกประเภท (เช่น ECDSA) ใช่หรือไม่ ไม่ว่าจะเป็นปัญหาใหญ่ ssh-keygen -tแต่เพียงกรณีของการใช้ ฉันพลาดอะไรไปรึเปล่า?
Jonathan H

1
แม้ว่าในตอนแรกอาจดูเหมือนจะยุ่งยาก แต่นี่คือคำตอบที่ถูกต้อง รหัสผ่านเป็นข้อมูลที่ละเอียดอ่อนและไม่ควรเก็บไว้อย่างชัดเจนหรือใช้อย่างไม่ระมัดระวังในโปรแกรม นั่นคือสิ่งที่คีย์ไฟล์มีไว้สำหรับ เพียงแค่เรียนรู้เกี่ยวกับไฟล์ข้อมูลประจำตัวrsync -eและssh -i .
Jonathan H

94

ใช้ยูทิลิตี้ผู้ให้บริการรหัสผ่าน 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

4
ฉันรู้ว่านี่ไม่ใช่แนวทางปฏิบัติที่ดีที่สุด แต่ฉันมี NAS ที่มี SSHD ที่พิการซึ่งจะไม่ทำการรับรองความถูกต้องตามคีย์ คำตอบนี้คือส่วนที่ขาดหายไปของปริศนาการสำรองข้อมูลอัตโนมัติของฉัน ดังนั้น +1 สำหรับคำตอบสุดท้าย
Mike Gossmann

8
ถ้าคุณไม่สามารถใช้ keyfile sshpass -p`cat .password` ssh [...]แต่ไม่ต้องการที่จะใส่รหัสผ่านในคำสั่งที่คุณสามารถเขียนมันเป็นไฟล์ชั่วคราวและรวมไว้เช่นนี้ จากนั้นปกป้อง.passwordไฟล์ของคุณโดยchmod 400 .passwordตรวจสอบให้แน่ใจว่ามีเพียงผู้ใช้ของคุณเท่านั้นที่สามารถอ่านได้
lutuh

5
เพื่อความสมบูรณ์ในกรณีที่ส่งไปยังเซิร์ฟเวอร์ระยะไกลsrc_pathควรเป็น server: path เช่น:server01.mydomain.local:/path/to/folder
harperville

นี่คือคำตอบที่ถูกต้อง! ช่วยให้คุณสามารถเขียนสคริปต์ได้โดยไม่ต้องใช้เวทมนตร์ ssh เพียงแค่เขียนสคริปต์ ;) Kudos @Rajendra
Genuinefafa

1
ตั้งแต่-aเปิด rsync รวมถึง-rlptgoDคุณสามารถย่อคำสั่งดังนี้:rsync -az ...
Jannie Theunissen

24

คุณสามารถหลีกเลี่ยงพรอมต์รหัสผ่านบนrsyncคำสั่งโดยตั้งค่าตัวแปรสภาพแวดล้อมRSYNC_PASSWORDเป็นรหัสผ่านที่คุณต้องการใช้หรือใช้--password-fileตัวเลือก


41
ใช้งานได้ก็ต่อเมื่อเซิร์ฟเวอร์ปลายทางมี rsync daemon ทำงานอยู่
Darryl Hebbes

4
แม้ว่าคำตอบนี้จะไม่ช่วยอะไรนอกจากใช้ rsync daemon แต่ Google ก็พาฉันมาที่นี่และมันก็เป็นสิ่งที่ฉันต้องการ สำหรับฉันฉันต้องการ rsync โดยตรงไปยัง rsyncd ไม่ใช่ ssh ฉันเพิ่งใช้ตัวเลือกไฟล์รหัสผ่านและทำงานได้อย่างสมบูรณ์แบบสำหรับสคริปต์
gregthegeek

15

หากคุณไม่สามารถใช้คีย์สาธารณะ / ส่วนตัวคุณสามารถใช้คาดหวัง:

#!/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 ด้วยรหัสผ่านของคุณ ตรวจสอบให้แน่ใจว่าไฟล์นี้ถูกจัดเก็บอย่างปลอดภัย!


3
คำสั่งเหล่านั้นไม่มีใน myRed Hat Enterprise Linux Server release 5.11 (Tikanga)
To Kra

13

ฉันทำให้มันทำงานดังนี้:

sshpass -p "password" rsync -ae "ssh -p remote_port_ssh" /local_dir  remote_user@remote_host:/remote_dir

จะremote_port_sshตั้งค่าเป็นอะไร? ดูเหมือนว่าตัวยึดสำหรับค่าจริง
Max Williams

6

ใช้คีย์ ssh

ดูและssh-keygenssh-copy-id

หลังจากนั้นคุณสามารถใช้rsyncวิธีนี้:

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

ถ้าฉันใช้คีย์กับ ssh ฉันเขียนว่า: ssh u @ serv -i ./rsa แต่จะทำอย่างไรใน rsync
liysd

2
หากคุณใส่คีย์ลงในไดเร็กทอรี. ssh ของคุณและตั้งชื่อมาตรฐาน (โดยทั่วไปคือ id_rsa / id_rsa.pub) rsync จะถูกเลือกโดยอัตโนมัติ
Craig Trader

6

ความเป็นไปได้ที่น่าสนใจอีกประการหนึ่ง:

  1. สร้างคู่คีย์ RSA หรือ DSA (ตามที่อธิบายไว้)
  2. ใส่คีย์สาธารณะเพื่อโฮสต์ (ตามที่อธิบายไว้แล้ว)
  3. วิ่ง:
rsync --partial --progress --rsh = "ssh -i dsa_private_file" host_name @ โฮสต์: / home / me / d

หมายเหตุ: -i dsa_private_fileซึ่งเป็นคีย์ส่วนตัว RSA / DSA ของคุณ

โดยพื้นฐานแล้ววิธีการนี้คล้ายคลึงกับวิธีที่ @Mad Scientist อธิบายไว้มาก แต่คุณไม่จำเป็นต้องคัดลอกคีย์ส่วนตัวของคุณไปที่ ~ / .ssh กล่าวอีกนัยหนึ่งก็คือมีประโยชน์สำหรับงานเฉพาะกิจ (เข้าถึงครั้งเดียวโดยไม่ต้องใช้รหัสผ่าน)


5

สิ่งต่อไปนี้ใช้ได้กับฉัน:

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


2
-a มีความหมายอยู่แล้ว -rlptgoD และโดยทั่วไปแล้วการลดบรรทัดคำสั่งที่นี่จะมีประโยชน์กว่ามาก
คริสเตียน

4

การป้อนรหัสผ่านโดยอัตโนมัติสำหรับคำสั่ง 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


2

ฉันใช้ไฟล์ 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}"

2

วิธีแก้ปัญหาอย่างเป็นทางการ (และอื่น ๆ ) ไม่สมบูรณ์เมื่อฉันเข้าเยี่ยมชมครั้งแรกฉันจึงกลับมาอีกหลายปีต่อมาเพื่อโพสต์วิธีการทางเลือกนี้ในกรณีที่มีคนอื่นมากระทบที่นี่โดยตั้งใจจะใช้คู่คีย์สาธารณะ / ส่วนตัว:

ดำเนินการนี้จากเครื่องสำรองข้อมูลเป้าหมายซึ่งดึงข้อมูลจากต้นทางไปยังข้อมูลสำรองเป้าหมาย

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 โดยไม่ต้องใช้รหัสผ่านเป็นวิธีการอื่นและไม่ใช้สำหรับการส่งรหัสผ่านผ่านไฟล์)


และข้อสังเกตที่สำคัญก็คือในตัวอย่างพอร์ตทางเลือกคุณกำลังกำหนด ssh ไปยังไฟล์คีย์ส่วนตัวของคุณและเมื่อรันคำสั่งกับเป้าหมายมันจะพิสูจน์ตัวตนกับคีย์สาธารณะ
oemb1905

-1

ตามแนวคิดที่โพสต์โดย 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.