ใช้ sftp เพื่อถ่ายโอนไดเรกทอรีหรือไม่


50

เมื่อฉันพยายามใช้ sftp เพื่อถ่ายโอนไดเรกทอรีที่มีไฟล์ฉันได้รับข้อความแสดงข้อผิดพลาด:

skipping non-regular file directory_name

ไดเรกทอรีประกอบด้วยไฟล์จำนวนหนึ่งและสองไดเรกทอรีย่อย

ผมทำอะไรผิดหรือเปล่า?

คำตอบ:


48

sftpเช่นcpและscpต้องการให้เมื่อคุณคัดลอกโฟลเดอร์ (และเนื้อหาในโฟลเดอร์อย่างชัดแจ้ง) คุณต้องบอกอย่างชัดเจนว่าคุณต้องการถ่ายโอนโฟลเดอร์ซ้ำด้วย-rตัวเลือก

ดังนั้นเพิ่ม-rคำสั่ง


2
-r หลังจากคำสั่ง put หรือไม่ ฉันได้รับข้อความแจ้งข้อผิดพลาด "put: Invalid flag -r" ถ้าฉันทำ การเพิ่มไปยังคำสั่ง sftp ดั้งเดิมจะไม่ทำงานเช่นกัน
haziz

5
เพิ่ม-rไปยังsftpคำสั่งเมื่อคุณเชื่อมต่อ sftp -r user@host
เควิน

1
@Kevin ฉันได้รับข้อผิดพลาดต่อไปนี้ "sftp: unknown option --r"
Amatya

2
ระวังว่ามีข้อผิดพลาดค่อนข้างนานใน SFTP OpenSSH ของ: Couldn't canonicalise: No such file or directoryเมื่อคัดลอกซ้ำไดเรกทอรีไปยังเซิร์ฟเวอร์ระยะไกลไดเรกทอรีที่ตัวเองต้องมีอยู่แล้วบนเซิร์ฟเวอร์เป้าหมายมิฉะนั้นการถ่ายโอนจะล้มเหลวด้วยข้อผิดพลาดที่ไม่ชัดเจน:
WhiteWinterWolf

5
ควรเป็นดังนี้:# sftp user@remote-host #> get -r remote-folder
hbinduni

20

rsyncฉันสามารถขอแนะนำให้คุณใช้ มันค่อนข้างมาตรฐานอุตสาหกรรมเมื่อย้ายไฟล์ผ่านการเชื่อมต่อที่ปลอดภัย

rsync -alPvz ./source_dir server.com:destination_dir

มันเป็นสิ่งที่ฉันใช้มานานหลายปีแล้วในตอนนี้

( -aตัวเลือกดูแลสิ่งต่าง ๆ เช่นการเรียกซ้ำไดเรกทอรี)


3
ชี้แจงเล็กน้อยเกี่ยวกับพารามิเตอร์ที่กล่าวถึง: -a= เรียกซ้ำ + เก็บลิงก์สัญลักษณ์สิทธิ์เวลาแก้ไขเจ้าของกลุ่มไฟล์พิเศษและไฟล์อุปกรณ์ (หลังจำเป็นต้องใช้สิทธิ์ผู้ใช้ขั้นสูง); -l= เก็บลิงก์สัญลักษณ์ (รวมอยู่ใน-a); -P= แสดงความคืบหน้าในระหว่างการถ่ายโอน + เก็บไฟล์ที่ถ่ายโอนบางส่วน; -v= โหมด verbose (แต่ดูเหมือนว่าจำเป็นเมื่อใช้-Pเพื่อหลีกเลี่ยงข้อผิดพลาดแปลก ๆprotocol version mismatch) -z= เปิดใช้งานการบีบอัดข้อมูลที่ถ่ายโอน
WhiteWinterWolf

@ WhiteWinterWolf ดูเหมือนว่าจะขึ้นอยู่กับรุ่นไม่ว่า-lจะต้องใช้สวิตช์หรือไม่ ผมจำได้ว่ารุ่นเก่าไม่ได้รวมอยู่ใน-l -a
polemon

5

คุณอาจใช้งานscpได้ รูปแบบทั่วไปคือ

scp -rp sourceDirName username@server:destDirName

scpหมายถึง "สำเนาที่ปลอดภัย" ธงนั้น

  • -r แบ่งเป็นไดเรกทอรีย่อย
  • -p รักษาเวลาการแก้ไข

ฉันเชื่อว่ารายการที่เหลือเป็นแบบอธิบายตนเอง


และ scp -rp -P <port> .... เมื่อใช้พอร์ตที่ไม่ได้มาตรฐาน
Pancho

4

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

1) เชื่อมต่อผ่านsftpโฮสต์ระยะไกล

2) เปลี่ยนเป็นรีโมตไดเร็กทอรีที่คุณต้องการคัดลอก (ตัวอย่าง: cd Music)

3) เปลี่ยนเป็นไดเรกทอรีท้องถิ่นที่คุณต้องการคัดลอกเนื้อหา (ตัวอย่าง: lcd Desktop)

4) ใช้คำสั่งนี้: get -r *


4

หากrsyncไม่ใช่ตัวเลือกฉันขอแนะนำต่อไปlftp:

lftp sftp://user@host.com/path/path/

จากนั้นใช้mirrorคำสั่งเพื่ออัปโหลดซ้ำดังนี้:

mirror -R

(หมายเหตุ recursion ที่เป็นค่าเริ่มต้นที่. -Rสำหรับการกลับ - เพื่อให้การอัปโหลดคำสั่งกระจกแทนการดาวน์โหลดลองเพิ่ม. --dry-runที่จะทำทดลองเพื่อให้แน่ใจว่าทำในสิ่งที่คุณคาดหวัง.)

หรือจะอัปโหลดโดยไม่มีการเรียกซ้ำ:

mirror --no-recursion

คุณต้องcdเข้าไปในไดเรกทอรีที่คุณต้องการสะท้อน ใช้งานได้ดี!


2

หากคุณสามารถใช้sshfs มันเป็นระบบไฟล์ของFUSE ที่มีอยู่ใน unices ที่ทันสมัยที่สุดและทำงานกับเซิร์ฟเวอร์ SFTP ใด ๆ นี่คือระบบไฟล์ระยะไกล: ช่วยให้คุณสามารถจัดการไฟล์ระยะไกล (ผ่านโปรโตคอล SFTP) ด้วยยูทิลิตี้ปกติ

mkdir /mount/point
sshfs server.example.com:/remote/path /mount/point
ls /mount/point
cp -Rp /mount/point/somedir /local/location
fusemount -d /mount/point

0

มันเป็นเรื่องเล็กน้อย แต่สิ่งที่ใช้ได้ผลสำหรับฉันคือ:

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

1
ไม่ทำงานกับ -rsftp> get -r data /opt/bin get: Invalid flag -r
Skynet

0

หากคำถามของคุณคือ 'ฉันจะใช้ SFTP เพื่อถ่ายโอนไดเรกทอรี' ได้อย่างไร

 sftp -r user@server

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

Scp

สำหรับการถ่ายโอนครั้งเดียวให้ลองอัปโหลด:

 # upload source directory to remote server
 scp -rp source_dir user@server:dest

 #download directory from remote server:
 scp -rp user@server:source_dir dest

 #specifying ssh key:
 scp -rp -i ~/.ssh/key user@server:source_dir dest

 #remote directory has spaces
 scp -rp -i ~/.ssh/key user@server:"source\\ dir" dest

rsync

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

rsync -r -a -v -e ssh --delete source_dir user@server:dest

นี่คือรายการของตัวเลือก rsync ที่พบบ่อยที่สุด: ( นำมาจากที่นี่ )

  • - ลบ - ลบไฟล์ที่ไม่มีอยู่ในผู้ส่ง (ระบบ)
  • -v - verbose (-vv จะให้ข้อมูลรายละเอียดเพิ่มเติม)
  • -e "ssh options" - ระบุ ssh เป็น remote shell
  • -a - โหมดเก็บถาวร - มันสงวนสิทธิ์ (เจ้าของกลุ่ม), เวลา, ลิงก์สัญลักษณ์และอุปกรณ์
  • -r - recurse ในไดเรกทอรี
  • -z - บีบอัดข้อมูลไฟล์ระหว่างการถ่ายโอน
  • - ยกเว้น 'ชื่อผู้ใช้งาน' - แยกโฟลเดอร์ที่เกี่ยวข้องออกจากการถ่ายโอน
  • -P - แสดงความคืบหน้าในระหว่างการถ่ายโอน

หวังว่าจะช่วย!


0

คุณสามารถได้รับจากเซิร์ฟเวอร์ไปยังเส้นทางท้องถิ่นของคุณโดย

scp -rp user@server:directoryname(full path) .

นี่เป็นการเพิ่มข้อมูลใหม่ให้กับคำตอบอื่น ๆ ที่โพสต์ไว้แล้วหรือไม่?
41754

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