sftp: อัปโหลดไฟล์ไดเรกทอรีและไดเรกทอรีย่อยทั้งหมดที่อยู่ในโฟลเดอร์


27

บนเครื่อง AI มีโฟลเดอร์

/home/a/

บนเครื่อง BI มีโฟลเดอร์

/home/b/

ฉันต้องการถ่ายโอนไฟล์ไดเร็กทอรีและไดเร็กทอรีย่อยทั้งหมดของ / home / a in / home / b ด้วย sftp บนเครื่อง AI ลองใช้คำสั่ง:

sftp fibon82@machineB.com
put /home/a/* /home/b/

แต่มันไม่ทำงานฉันได้รับข้อความแสดงข้อผิดพลาด: "การข้ามไฟล์ / home / a / a1" ข้ามไม่ใช่ ... ... [a1 เป็นไดเรกทอรีย่อยของ a]
ฉันจะแก้ไขคำสั่งที่ใส่ได้อย่างไร

ขอบคุณ! :)

แก้ไข:

ฉันแก้ไขโดยใช้ scp:

scp -r /home/a/ fibon82@machineB.com:/home/b/

2
put -rก็คงจะทำงานเหมือนกัน
WakiMiko

1
ตกลง แต่ฉันจะรู้ได้อย่างไรว่าคำสั่ง "put command" มีตัวเลือก -r ให้ใช้งานหรือไม่ ถ้าฉันดูที่นี่เฉพาะธง -P อธิบายไว้ ... เหมือนกันในคู่มือ ขอบคุณ! :)
fibon82

คุณควรโพสต์สิ่งนั้นเป็นคำตอบแทน
NN

ใช่. แทนที่จะแก้ไขคำถามของคุณด้วยคำตอบคุณควรตอบคำถามของคุณเองและยอมรับมัน

@ fibon82 สำหรับ up-to-วันด้วยตนเองเพื่อ OpenSSH sftpดูที่โครงการ OpenSSH
Martin Prikryl

คำตอบ:


21

แม้ว่าจะไม่เทียบเท่า sftp อย่างเคร่งครัดrsyncเป็นทางเลือกที่ทรงพลังมากสำหรับ scp และ sftp โดยเฉพาะอย่างยิ่งเมื่ออัปเดตสำเนาจากเครื่อง A ไปยังเครื่อง B เนื่องจากไม่ได้คัดลอกไฟล์ที่ยังไม่ได้ทำการเปลี่ยนแปลง นอกจากนี้ยังสามารถลบไฟล์ออกจากเครื่อง B ที่ถูกลบออกจากเครื่อง A (เฉพาะเมื่อมีการแจ้งให้ทราบเท่านั้น)

ในกรณีของคุณไวยากรณ์จะเป็น

rsync -zrp /home/a/ user@remote.host.com:/home/b/

-rตัวเลือกสำหรับการคัดลอกไฟล์ซ้ำ-zทำให้การบีบอัดระหว่างการถ่ายโอนและ-pเก็บรักษาสิทธิ์ของแฟ้ม (การสร้างแฟ้ม, แก้ไข, ฯลฯ ) เมื่อคัดลอกซึ่งเป็นสิ่งที่ SCP ไม่ได้ทำ AFAIK ตัวเลือกอื่น ๆ อีกมากมายเป็นไปได้; ตามปกติอ่านmanหน้า


อ้าขอบคุณ! :) สิ่งใหม่ที่ฉันเรียนรู้!
fibon82

@ fibon82: ไม่เป็นไร :)
Karolos

1
ฉันรักคุณฉันซิงค์ข้อมูล 400MB ใน 1 นาทีโดยใช้รหัสของคุณ ฉันจะเพิ่มคุณควรใช้ --progress มิฉะนั้นคุณจะจ้องมองอะไรโดยไม่ทราบว่าเกิดอะไรขึ้น (และสิ่งที่ความเร็ว :))
Sandro Antonucci

1
น่าเศร้าที่rsyncไม่ได้พูดsftp-Protocol ดังนั้นถ้าคุณตั้งค่าsftp-chroot ใช้ssh's สร้างในinternal-sftpนั้นrsyncล้มเหลว
Tino

17

ในsftpคำสั่งนี้จะอัปโหลดเนื้อหาของไดเรกทอรีปัจจุบันซ้ำไปยังไดเรกทอรีปัจจุบันระยะไกล:

 put -r .

man sftpดู


-rสวิทช์ได้รับการสนับสนุนตั้งแต่OpenSSH 5.4เท่านั้น
Martin Prikryl

1
โปรดทราบว่า-rสวิตช์เป็นฝั่งไคลเอ็นต์เท่านั้น (ส่วนหนึ่งของsftpคำสั่ง) ดังนั้นฝั่งเซิร์ฟเวอร์ (ที่นี่: การรับ) ไม่จำเป็นต้องใช้ OpenSSH 5.4 เฉพาะไคลเอ็นต์เท่านั้นที่ต้องการสนับสนุน
Tino

9

scp(สำเนาที่ปลอดภัย) เป็น Linux de พฤตินัยสำหรับการถ่ายโอนไฟล์ผ่านอุโมงค์ที่ปลอดภัย ในกรณีของคุณคุณต้องการใช้สวิตช์แบบเรียกซ้ำเช่น:

scp -r /home/a/ user@remote.host.com:/home/b/

5
sftp และ scp เป็นโปรโตคอลที่ต่างกันจริง ๆ แล้วทั้งคู่อ้างอิงจาก ssh
Paradroid

1
ใช่ถ้าเซิร์ฟเวอร์อนุญาตโปรโตคอล sftp เท่านั้นคำตอบนี้ใช้ไม่ได้
рüффп

4

ลองใช้ดู

put -r /home/a/ /home/b/

สำหรับข้อมูลเพิ่มเติมตรวจสอบ: นี่


1
-rสวิทช์ได้รับการสนับสนุนตั้งแต่OpenSSH 5.4เท่านั้น
Martin Prikryl

โปรดทราบว่า-rสวิตช์เป็นฝั่งไคลเอ็นต์เท่านั้น (ส่วนหนึ่งของsftpคำสั่ง) ดังนั้นฝั่งเซิร์ฟเวอร์ (ที่นี่: การรับ) ไม่จำเป็นต้องใช้ OpenSSH 5.4 เฉพาะไคลเอ็นต์เท่านั้นที่ต้องการสนับสนุน และ: นี่ควรเป็นคำตอบที่ได้รับการยอมรับว่าการได้รับ (อาจไม่ได้รับการสนับสนุน) rsyncเป็นคำตอบของคำถามที่ติดแท็กsftpจะสับสนเล็กน้อย
Tino

0

ที่จริงแล้ว -r ควรทำงาน แต่โฟลเดอร์ปลายทางต้องอยู่ในโฮสต์ระยะไกลของคุณ:

sftp> put -r sourcefolder
 Uploading sourcefolder/ to /user/folder
 Couldn't canonicalize: No such file or directory
 ....
sftp> mkdir sourcefolder
sftp> put -r sourcefolder
 Uploading sourcefolder/ to /user/folder/sourcefolder
 Entering sourcefolder/
 sourcefolder/file1
 sourcefolder/file2

คุณได้เพิ่มการอ้างอิงและหลักฐานสนับสนุนสิ่งที่คุณระบุและยืนยันว่าคำตอบนี้ยังไม่ได้รับคำตอบในหนึ่งในคำตอบที่มีอยู่ในโพสต์ อ่าน"ทำไมฉันต้องมี 50 ชื่อเสียงในการแสดงความคิดเห็น"เพื่อให้แน่ใจว่าคุณเข้าใจว่าคุณสามารถเริ่มแสดงความคิดเห็นได้อย่างไร
Pimp Juice IT

-1

ในกรณีของฉันrsyncเป็นไปไม่ได้ดังนั้นฉันจึงใช้:

mput -rp /home/a/ /home/b/

ไม่มีเป็นmputคำสั่งใน sftpOpenSSH คุณอาจอ้างถึงpsftp?
Martin Prikryl
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.