เป็นไปได้ไหมที่จะใช้ rsync บน sftp (โดยไม่มี ssh shell)?


60

Rsync ผ่าน ssh ใช้งานได้ดีทุกครั้ง

อย่างไรก็ตามการพยายาม rsync ไปยังโฮสต์ที่อนุญาตการล็อกอิน sftp เท่านั้น แต่ไม่ใช่การล็อกอิน ssh แสดงข้อผิดพลาดต่อไปนี้:

rsync -av / source ssh user @ remotehost: / target /

โปรโตคอลรุ่นไม่ตรงกัน - เปลือกของคุณสะอาดหรือไม่ (ดูหน้าคำอธิบาย rsync man) ข้อผิดพลาด rsync: ความเข้ากันไม่ได้ของโปรโตคอล (รหัส 2) ที่ compat.c (171) [ผู้ส่ง = 3.0.6]

นี่คือส่วนที่เกี่ยวข้องจากหน้า rsync:

ข้อความนี้มักจะเกิดจากสคริปต์เริ่มต้นของคุณหรือตัวช่วยสร้างเชลล์ระยะไกลสร้างขยะที่ไม่พึงประสงค์บนสตรีมที่ rsync ใช้สำหรับการส่งผ่าน วิธีในการวินิจฉัยปัญหานี้คือการเรียกใช้เปลือกระยะไกลของคุณเช่นนี้:

          ssh remotehost /bin/true > out.dat

จากนั้นดู out.dat หากทุกอย่างทำงานอย่างถูกต้องแล้ว out.dat ควรเป็นไฟล์ความยาวเป็นศูนย์ หากคุณได้รับข้อผิดพลาดจาก rsync คุณอาจจะพบว่า out.dat มีข้อความหรือข้อมูลบางส่วน ดูเนื้อหาและพยายามหาสิ่งที่ผลิตออกมา สาเหตุส่วนใหญ่มีการกำหนดค่าสคริปต์เริ่มต้นเชลล์อย่างไม่ถูกต้อง (เช่น. cshrc หรือ. Profile) ที่มีคำสั่งเอาต์พุตสำหรับการเข้าสู่ระบบแบบไม่โต้ตอบ

ลองทำสิ่งนี้ในระบบของฉันสร้างสิ่งต่อไปนี้ใน out.dat:

ssh-dummy-shell: ไม่อนุญาตให้ใช้คำสั่ง

อย่างที่ฉันคิดว่าโฮสต์ไม่อนุญาตให้ล็อกอิน ssh

ลิงค์ต่อไปนี้แสดงให้เห็นว่าเป็นไปได้ที่จะทำภารกิจนี้ให้สำเร็จโดยใช้ฟิวส์ที่มี sshfs - แต่มันช้ามากและไม่เหมาะสำหรับการใช้งานจริง

มีโอกาสในการรับ rsync sftp ทำงานหรือไม่


3
lftp จะทำเคล็ดลับ ฉันจะซิงค์โลคัลกับรีโมตด้วยสวิตช์ -R

คุณรู้วิธี จำกัด คำสั่งบนเซิร์ฟเวอร์หรือไม่? หากเป็นการตั้งค่า ForceCommand ใน sshd_config ให้ดูว่าคุณสามารถแก้ไขไฟล์ที่ชี้ไปได้หรือไม่ หรือถ้ามันถูกตั้งค่าโดยคำสั่งใน authorized_keys แล้วบางทีคุณสามารถเข้าถึง authorized_keys ผ่าน sshfs และเปลี่ยนมันได้หรือไม่
ptman

คุณสามารถลองcsync : csync /home/csync sftp://csync@krikkit.galaxy.site:2222/home/csyncดูคำตอบนี้
nachtigall

6
ในที่สุดฉันก็ทำมันด้วยlftp :lftp -e "mirror -eRv /local/dir/ /remote/dir; quit;" sftp://user@server:port
nachtigall

@nachtigall คุณรู้วิธีใช้ lftp กับไฟล์อินพุตหลายไฟล์ / รายชื่อไฟล์และ dirs หรือไม่?
bortran

คำตอบ:


39

น่าเสียดายที่ไม่ใช่โดยตรง rsyncจำเป็นต้องมีการเชื่อมโยงใหม่ทั้งหมดที่มีเชลล์ที่จะอนุญาตให้เริ่มการทำงานของรีโมตสำเนาrsyncเมื่อรันด้วยวิธีนี้

หากคุณมีวิธีการใช้กระบวนการรับฟังที่ยาวนานบนโฮสต์คุณสามารถลองเริ่ม rsync ด้วยตนเองเพื่อรับฟังการเชื่อมต่อบนพอร์ตที่ไม่มีสิทธิพิเศษ แต่เทคนิคส่วนใหญ่สำหรับการทำเช่นนั้นจะต้องใช้การเข้าถึงเชลล์ที่เหมาะสมผ่าน SSH ด้วยเช่นกัน การเตรียมไฟร์วอลล์โฮสต์ให้การเชื่อมต่อในพอร์ตที่คุณเลือก (และโฮสต์ที่มีการติดตั้ง rsync ในสถานที่แรก) การเรียกใช้ rsync เป็นบริการที่สามารถเข้าถึงได้แบบสาธารณะ (ไม่ใช่ทางอ้อมผ่าน SSH หรือคล้ายกัน) ไม่แนะนำให้ใช้กับข้อมูลที่ไม่ใช่ข้อมูลสาธารณะ

หากโฮสต์ของคุณอนุญาตให้ใช้สคริปต์ใน PHP หรือคล้ายกันและไม่มีการล็อคไว้ดังนั้นกระบวนการเพิ่มเติมไม่สามารถแก้ไขได้execโดยสคริปต์ผู้ใช้คุณสามารถลองเริ่ม rsync ในโหมดการฟังได้ หากปลายทางของคุณเชื่อมต่อได้ (คุณกำลังเรียกใช้ SSH ที่สามารถเข้าถึงได้จากโลกภายนอก) คุณสามารถลองย้อนกลับได้ - ให้สคริปต์เรียกใช้ rsync บนเซิร์ฟเวอร์ แต่แทนที่จะฟังการเชื่อมต่อขาเข้าให้ติดต่อบริการในพื้นที่ของคุณแล้วซิงค์ด้วยวิธีนั้น สิ่งนี้ยังคงขึ้นอยู่กับการติดตั้ง rsync จริงบนโฮสต์ที่ไม่ได้รับหรือว่าคุณสามารถอัปโหลดสำเนาการทำงาน แต่ไม่มีผลกระทบด้านความปลอดภัยในการใช้ rsync daemon ในแบบที่สามารถระบุตัวได้แบบสาธารณะและพูดคุยกับมันผ่านการเข้ารหัส ช่อง

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


2
โปรดทราบว่าไม่จำเป็นต้องเป็นเชลล์แบบเต็ม มันเพียงแค่ต้องอนุญาตให้คำสั่ง rsync มีอาร์กิวเมนต์ที่เหมาะสมในการทำงาน scponly มีประโยชน์สำหรับสิ่งนี้
sciurus

19

ในทางทฤษฎีใช่ คุณสามารถติดตั้งระบบแฟ้มระยะไกลบนเครื่องของคุณโดยใช้ FUSE จากนั้นคุณสามารถเรียกใช้สำเนาท้องถิ่นของ rsync ระหว่างไดเรกทอรีที่ติดตั้งและไดเรกทอรีท้องถิ่น ฉันไม่ได้ลองทำแบบนี้เป็นการส่วนตัว แต่ควรใช้งานได้ในทางทฤษฎี มีแนวโน้มว่าจะมีประสิทธิภาพน้อยกว่ามากในการดำเนินการ rsync ผ่าน SSH เพราะจะต้องโอนอย่างน้อยส่วนหนึ่งของแต่ละไฟล์เพื่อทำการเปรียบเทียบ


11
ซึ่งควรใช้งานได้เมื่อเปรียบเทียบการประทับเวลา + ขนาดก็เพียงพอแล้วที่จะตัดสินใจว่าต้องส่งอะไร ทันทีที่จำเป็นต้องมีการตรวจสอบ aa ไฟล์ระยะไกลทั้งหมดจะถูกอ่านผ่านทางสายรวมทั้งการอัปเดตที่ส่งมาดังนั้นโปรดตรวจสอบให้แน่ใจว่าคุณมีตัวเลือก rsync ที่ตั้งไว้ว่าจะทำทั้งหมดหรือไม่มีอะไรสำหรับแต่ละไฟล์ ครั้งหรือ - ตรวจสอบและมี - ทั้งไฟล์ที่ระบุอาจเพียงพอ) ตัวเลือกบางอย่างเช่น --link-dest นั้นไม่น่าจะทำงานได้อย่างถูกต้อง (หรือเลย)
David Spillett

ขอบคุณสำหรับการเพิ่มรายละเอียดบางอย่างเดวิด ที่ชนิดของข้อ จำกัด ในประสิทธิภาพผมคิดว่าเพียงแค่ไม่ได้เป็นปล้องพวกเขามากเช่นกัน :)
Kamil Kisiel

มันเป็นวิธีแก้ปัญหาที่มีข้อ จำกัด ใช่ แต่มันก็ดีพอถ้าไม่มีทางที่จะเรียก rsync "ถูกต้อง" ได้
Valery Lourie

10

อีกทางเลือกหนึ่งในการใช้ rsync คือแทนที่จะใช้ lftp (ซึ่งสามารถเชื่อมต่อกับ sftp) และใช้คำสั่งมิเรอร์ ตัวอย่างหนึ่งสามารถทำได้

lftp
~> open -u user,password sftp://host.com
~> mirror remotedir outdir
~> quit

1
ในขณะที่โพสต์นี้ไม่ตอบคำถามมันมีทางเลือกที่เป็นประโยชน์
Dmitri Chubarov

5

สายไปหน่อย แต่นี่คือวิธีที่ฉันทำโดยใช้ sshfs

  source /scratch/slimdata/password.sh
  mkdir tmp_mnt
  echo $PASSWORD | sshfs user@host:dir tmp_mnt -o password_stdin
  rsync -rutL --delete tmp_mnt/ to_sync/
  fusermount -u tmp_mnt
  rmdir tmp_mnt

3
ในฐานะที่เป็น @David Spillett กล่าวว่าในความคิดเห็นของเขาเกี่ยวกับคำตอบก่อนหน้านี้ ( serverfault.com/questions/135618/ … ) สิ่งนี้จะใช้งานได้ แต่เป็นการใช้งานโปรโตคอล rsync ที่ไม่มีประสิทธิภาพ
Evan Anderson

2
โจนาธานฉันคิดว่าทางออกของคุณผิด หากคุณเชื่อมต่อไดรฟ์ระยะไกลและดำเนินการ rsync เช่นเดียวกับการซิงค์สองโฟลเดอร์ในเครื่องจะมีการถ่ายโอนข้อมูลทุกอย่างที่ทำข้อมูลให้ตรงกันเสมอเนื่องจากกระบวนการ rsync บนเครื่องท้องถิ่นของคุณจะคำนวณค่าแฮชของไฟล์ระยะไกล ซึ่งหมายความว่าไฟล์ทั้งหมดถูกถ่ายโอนและประโยชน์ของ rsync จะหายไป แก้ไข: อาคำตอบนี้ได้รับหลายครั้ง ... sry สำหรับการจำลองแบบ: D
Thekwasti

2

ไม่ rsync ทำงานโดยการเรียกใช้ rsync ที่อีกด้านหนึ่งและสื่อสารกับมันซึ่งหมายความว่าจำเป็นต้องใช้การเข้าถึงเชลล์บางรูปแบบ


2

อีกทางเลือกหนึ่งคือเริ่ม rsync เป็น daemon และเชื่อมต่อผ่านอุโมงค์ SSH


คำตอบนี้สั้นเกินไปที่จะเป็นประโยชน์อย่างสมบูรณ์ แต่ถ้าฝั่งเซิร์ฟเวอร์ไม่สามารถอนุญาตการเข้าถึงเชลล์ แต่สามารถอนุญาตให้ (1) เซิร์ฟเวอร์ rsync กำลังฟังในเครื่อง (ไม่สามารถใช้งานจากภายนอกเพื่อความปลอดภัย) และ (2) ssh tunnel จากนั้นใน หลักการหนึ่งได้เข้าสู่ระบบเซิร์ฟเวอร์ผ่านกฎในการที่ช่วยให้อุโมงค์ที่เฉพาะเจาะจงและทำงานเช่นauthorized_keys sleep 86400จากนั้นฝั่งไคลเอ็นต์สามารถrsyncผ่านอุโมงค์ได้
Stéphane Gourichon

2

ตัวเลือกการรวมที่ดีที่สุดของทั้งหมด

ดูเหมือนจะมีข้อได้เปรียบต่อไปนี้ซึ่งคำตอบอื่น ๆ ที่นี่ไม่มี:

  • ได้ประโยชน์อย่างเต็มที่จาก SSH (ปลอดภัย)
  • รับประโยชน์อย่างเต็มที่จาก rsync (โปรโตคอลแบนด์วิดท์ที่มีประสิทธิภาพ, ตัวเลือก rsync ทั้งหมดเช่นการ จำกัด แบนด์วิดท์)
  • มีประสิทธิภาพจริง ๆ (ต่างจาก sshfs ซึ่งช่วยประหยัดเวลาในบางครั้ง แต่ก็ยังช้าในทางปฏิบัติ)
  • ไม่ต้องการคำสั่งเชลล์โดยพลการด้านเซิร์ฟเวอร์
  • ไม่ต้องการเซิร์ฟเวอร์เพื่ออนุญาตช่องสัญญาณ ssh
  • ไม่ต้องการให้เซิร์ฟเวอร์รันrsyncdaemon

ผมยังไม่ได้ทดสอบมัน rrsyncแต่ฉันได้ใช้ประสบความสำเร็จคุณสมบัติทั้งหมดที่ยกเว้น

ทำอย่างไร

  • สร้างคีย์ภายในเครื่องด้วยssh-keygen(คุณสมบัติ openSSH)
  • อนุญาตการเข้าสู่ระบบด้วยคีย์เฉพาะนั้นเท่านั้นโดยมีรายการในเซิร์ฟเวอร์~/.ssh/authorized_keys(คุณสมบัติ openSSH)
  • เชื่อมโยงคีย์นี้กับคำสั่งเฉพาะโดยใช้~/.ssh/authorized_keys(คุณสมบัติ openSSH) โดยใช้เป็นคำสั่งของสคริปต์ที่rrsyncแจกจ่ายด้วย rsync ซึ่งคล้ายกับcommand="$HOME/bin/rrsync -ro ~/backups/",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-

จากนั้นคุณสามารถ rsync จากลูกค้าได้ตามปกติ

หากคุณต้องการรายละเอียดเพิ่มเติม

การ จำกัด การเข้าถึง SSH เพื่อ rsync | Guy Rutenberg

เกินหนึ่งขั้นตอนเหนือลิงก์ด้านบน

คำสั่งที่ท้ายหน้านั้นสามารถทำให้สั้นลงได้ ในการ~/.ssh/configสร้างบทบาทเช่นนี้:

Host remote # can be host or ip or custom-label User user # login on remote host HostName optional-dns-resolvable-host-or-ip # if label used above IdentityFile ~/.ssh/id_remote_backup

จากนั้นคำสั่ง rsync ของคุณจากไคลเอนต์

rsync -e "ssh -i $HOME/.ssh/id_remote_backup" -av user@remote: etc2/

กลายเป็น

rsync -av user@remote: etc2/

1
น่าเสียดายที่นี่ไม่มีอะไรเกี่ยวข้องกับการใช้ rsync กับเซิร์ฟเวอร์ SFTP นี่เป็นเรื่องเกี่ยวกับการกำหนดค่าเซิร์ฟเวอร์ OpenSSH เพื่อให้rsyncทำงานได้ หากคุณพบกับเซิร์ฟเวอร์ SFTP ของบุคคลอื่นซึ่งคุณไม่สามารถควบคุมได้คำตอบนี้ไม่สามารถแก้ปัญหาได้
Malvineous

คุณถูก. ฉันอาจจะเขียนสิ่งนี้เพื่อตอบคำถามอื่นและโพสต์ที่นี่โดยไม่ได้ตั้งใจ ฉันกำลังพิจารณาที่จะลบคำตอบของฉันที่นี่
Stéphane Gourichon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.