กำลังอัปโหลดไดเรกทอรีด้วย sftp หรือไม่


97

ฉันมีปัญหาในการอัปโหลดไดเรกทอรี (ซึ่งมีไดเรกทอรีอื่น ๆ อยู่สองสามระดับลึก) โดย sftp ฉันรู้ว่าฉันสามารถแก้ไขสิ่งนี้ได้โดยการ gzipping แต่ฉันไม่เห็นว่าทำไมจึงจำเป็น

อย่างไรก็ตามฉันพยายาม

sftp> put bin/
Uploading bin/ to /home/earlz/blah/bin
bin/ is not a regular file
sftp> put -r bin/
Uploading bin/ to /home/earlz/blah/bin
Couldn't canonicalise: No such file or directory
Unable to canonicalise path "/home/earlz/blah/bin"

ฉันคิดว่าข้อความแสดงข้อผิดพลาดสุดท้ายนั้นโง่มาก ดังนั้นไดเรกทอรีไม่อยู่? ทำไมไม่สร้างไดเรกทอรี?

อย่างไรก็ตามมีปัญหาเกี่ยวกับ sftp อยู่หรือฉันควรใช้ scp หรือไม่

คำตอบ:


68

การแก้ไข : ผมเริ่มอ้างว่าผิด OpenSSH put -rไม่สนับสนุน มันทำ แต่มันทำในวิธีที่แปลกมาก ดูเหมือนว่าคาดว่าไดเรกทอรีปลายทางจะมีอยู่แล้วด้วยชื่อเดียวกันกับไดเรกทอรีแหล่งที่มา

sftp> put -r source
 Uploading source/ to /home/myself/source
 Couldn't canonicalize: No such file or directory
 etc.
sftp> mkdir source
sftp> put -r source
 Uploading source/ to /home/myself/source
 Entering source/
 source/file1
 source/file2

สิ่งที่แปลกเป็นพิเศษคือสิ่งนี้ใช้งานได้แม้ว่าคุณจะให้ชื่ออื่นสำหรับปลายทาง:

sftp> put -r source dest
 Uploading source/ to /home/myself/dest
 Couldn't canonicalize: ...
sftp> mkdir dest
sftp> put -r source dest
 Uploading source/ to /home/myself/dest/source
 Couldn't canonicalize: ...
sftp> mkdir dest/source
sftp> put -r source dest
 Uploading source/ to /home/myself/dest/source
 Entering source/
 source/file1
 source/file2

สำหรับการเรียกซ้ำที่ใช้งานได้ดีขึ้นputคุณสามารถใช้psftpเครื่องมือบรรทัดคำสั่งPuTTY แทน มันอยู่ในputty-toolsแพ็คเกจภายใต้ Debian (และ Ubuntu ส่วนใหญ่)

อีกทางหนึ่ง Filezilla จะทำสิ่งที่คุณต้องการหากคุณต้องการใช้ GUI


FYI: sftpอนุญาตput -rจากOpenSSH 5.4
Tino

3
ขอบคุณ - ฉันแก้ไขคำตอบแล้ว มันเกี่ยวกับเวลาเหรอ? ;-P
Jander


22

คุณอาจสนใจใช้rsyncแทน คำสั่งสำหรับสิ่งนั้นก็คือ

 rsync --delete --rsh=ssh -av bin/ remote-ip-or-fqdn:/home/earlz/blah/bin/

นี้จะคัดลอกทุกอย่างในและวางไว้ในบนเซิร์ฟเวอร์ระยะไกลในbin/ /home/earlz/blah/bin/ในฐานะที่เป็นประโยชน์เพิ่มเติมมันจะตรวจสอบก่อนเพื่อดูว่าไฟล์ในด้านระยะไกลไม่ได้เปลี่ยนและถ้ามันไม่ได้มันจะไม่ส่งอีกครั้ง นอกจากนี้คุณสามารถเพิ่มตัวเลือก -z และมันจะบีบอัดให้คุณ


Awsome! ง่ายมาก!
Asken

3
โปรดทราบว่าsftpเป็นคำสั่งและโปรโตคอล rsyncไม่รองรับsftp-protocol
Tino

9

lcd: โฟลเดอร์ในเครื่องของคุณ (พร้อมโฟลเดอร์ย่อย)

cd: โฟลเดอร์ระยะไกลของคุณ

put -r .


จริง ๆ แล้วฉันคิดว่านี่เป็นคำตอบที่ถูกต้องที่สุด ... เพื่อจุดประสงค์ในการวางโฟลเดอร์ทั้งหมดของฉันไว้ที่นั่น
nopole

sftp บ่นเมื่อฉัน cd'd ลงในโฟลเดอร์หลักท้องถิ่นและพยายามที่จะนำไดเรกทอรีตามชื่อ แต่cdกำลังเข้าไปในไดเรกทอรีที่ฉันต้องการจะอัปโหลดทำได้ ขอขอบคุณ!
karimkorun

8

ฉันขอแนะนำคำตอบที่ค่อนข้างซับซ้อนได้โดยไม่ต้องซิป แต่รวมถึงน้ำมันดิน?

ไปเลย:

tar -cf - ./bin | ssh target.org " ( cd /home/earlz/blah ; tar -xf - ) "

นี้จะแพ็คไดเรกทอรี. / bin กับ tar (-cf: = สร้างไฟล์), ชื่อไฟล์ - (ไม่มี, stdout) และไปป์ผ่านคำสั่ง ssh-to ไปยัง target.org (ซึ่งอาจรวมถึง IP) โดยที่คำสั่ง ในเครื่องหมายคำพูดจะดำเนินการซึ่งก็คือ: cd เพื่อ blah และ tar -xf (แยกไฟล์) - ไม่มีไม่มีชื่อเพียงแค่ stdin

ราวกับว่าคุณแพ็คเก็จที่บ้านนำมาไว้ที่โพสต์จากนั้นขับรถไปทำงานที่คุณคาดหวังแพ็กเกจและเปิดมัน

อาจจะมีวิธีแก้ปัญหาที่สง่างามกว่าซึ่งเพิ่งใช้ sftp


ประปาtarเป็นทางออกที่ดีมาก แต่นี้ต้องsshสนับสนุนการเข้าสู่ระบบ ( sftpเป็นโปรโตคอลที่แตกต่างกันอยู่ด้านบนของssh) tarซึ่งแตกต่างจากผู้อื่นโดยค่าเริ่มต้นเรียกใช้ซ้ำโอนไฟล์พิเศษทั้งหมด (FIFO, บล็อก / อุปกรณ์ตัวละคร ฯลฯ ) พยายามที่จะแปลการทำแผนที่ UID / GID จากแหล่งที่มาไปยังระบบเป้าหมายและมี commandline สั้นแบบดั้งเดิม (แม้ว่าจะมีข้อยกเว้นหนึ่งอย่าง: "ซ็อกเก็ตโดเมน Unix" จะไม่ถูกถ่ายโอน แต่ใครต้องการสิ่งเหล่านั้น?)
Tino

ฉันใช้วิธีนี้เมื่อฉันต้องการการบีบอัดระหว่างโหนดและคุณสามารถใช้pvเครื่องมือเพื่อดูความเร็วในการถ่ายโอนนาน
Felipe Alcacibar


1

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

ตัวอย่างเช่น :

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

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


0

ลงชื่อเข้าใช้เซิร์ฟเวอร์ระยะไกลด้วย ssh ใช้ sftp เพื่อเชื่อมต่อกลับไปที่กล่องของคุณจากนั้นใช้get -rคำสั่งเพื่อถ่ายโอนไดเรกทอรีไปยังเซิร์ฟเวอร์ระยะไกล คำสั่ง get ช่วยให้คุณสามารถถ่ายโอนไดเรกทอรีซ้ำโดยไม่ต้องสร้างไดเรกทอรีแล้ว

ssh remote ip
sftp local ip 
get -r whichever-dir

0

กรณี SFTP:

ฉันต้องการคัดลอกโครงสร้างนั้นใน ftp ของฉัน:

mainfolder --- folder --- subfolder
                  |           |
              file1.txt   file2.txt

ที่แก้ไขปัญหาของฉัน:

cd ./mainfolder
mkdir folder
put -r /from/source/folder/* /mainfolder/folder/
cd ./folder
mkdir subfolder
put -r /from/source/folder/subfolder/* /mainfolder/folder/subfolder/

0

ฉันเพิ่งเรียนรู้จากArch Linux Wikiว่าเป็นไปได้ที่จะเมาท์ sftp-share โดยใช้ sshfs ฉันใช้เซิร์ฟเวอร์ SFTP กับ chroot และคุกและ sshfs ทำงานได้ดีมาก

  1. เมาท์: sshfs <sftpuser>@<server>:<read/writable/directory> <your/local/mount/directory>
  2. ยกเลิกการเชื่อมต่อ: fusermount -u <your/local/mount/directory>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.