ฉันจะคัดลอกหลายไฟล์ผ่าน scp ในคำสั่งเดียวได้อย่างไร


20

ฉันต้องขนส่งไฟล์จำนวนมากจากพีซีเครื่องหนึ่งไปยังอีกเครื่องหนึ่ง (ทั้ง Linux) ฉันต้องการใช้scpสำหรับสิ่งนั้น แต่scpอนุญาตให้ถ่ายโอนไฟล์ได้ครั้งละหนึ่งไฟล์เท่านั้น

ฉันจะทำสิ่งนี้ได้อย่างไร

ฉันมี

  • ไม่มีความเป็นไปได้ที่จะใช้ rsync หรือโปรโตคอลอื่น ๆ
  • ไม่มีความเป็นไปได้ที่จะใช้ใบรับรองที่ไม่มีข้อความรหัสผ่าน (แต่มีใบรับรองที่มีข้อความรหัสผ่าน)
  • รายการไฟล์ที่จะถ่ายโอนและรายการที่มีพา ธ ปลายทางของไฟล์บนเซิร์ฟเวอร์อื่น
  • ไฟล์ถูกกระจายไปทั่วไดเรกทอรีจำนวนมากและไม่ใช่ไฟล์ทั้งหมดในไดเรกทอรีที่ฉันต้องการคัดลอก

ถ้าเป็นไปได้ฉันต้องการ gzip และ ungzip เพื่อประหยัดแบนด์วิดธ์!

เป็นไปได้ไหม

คำตอบ:


31

ใช้tar:

tar cvzf - -T list_of_filenames | ssh hostname tar xzf -

2
นี่คือรูปแบบไฟล์: "ในโหมด c tar จะอ่านชื่อที่จะถูกเก็บถาวรจากชื่อไฟล์ชื่อพิเศษ-C'' on a line by itself will cause the current directory to be changed to the directory specified on the following line. Names are terminated by newlines unless --null is specified. Note that --null also disables the special handling of lines containing -C ''
Kousha

14

ฉันต้องการใช้ scp สำหรับสิ่งนั้น แต่ scp อนุญาตให้ถ่ายโอนไฟล์ครั้งละหนึ่งไฟล์เท่านั้น

ฉันค่อนข้างแน่ใจว่าไม่เป็นความจริงอย่างน้อยก็ไม่ใช่scpคำสั่งของ OpenSSH ที่รวมอยู่ใน Linux ส่วนใหญ่

ฉันใช้งานscp file1 file2 ... fileN user@host:/destination/directory/ค่อนข้างบ่อย

สำหรับการบีบอัดแบบโปร่งใสโปรโตคอล SSH มีสิ่งนี้ในตัวและscpสามารถใช้ได้หากคุณมี-Cตัวเลือกในบรรทัดคำสั่ง สำหรับไฟล์ขนาดเล็กจำนวนมากที่คล้ายกันคุณจะพบตัวเลือก tar + gz ที่แนะนำโดย akira ทำให้มีการบีบอัดที่ดีขึ้นเนื่องจากสามารถใช้ความคล้ายคลึงกันระหว่างไฟล์ดังกล่าวซึ่งscpบีบอัดแต่ละไฟล์เป็นเอนทิตีแยกต่างหาก โดยทั่วไปฉันต้องการใช้ scp แม้ว่าจะเป็นการง่ายกว่าที่จะให้การถ่ายโอนบางส่วนกลับมาใช้งานได้ง่ายขึ้น (หรือแม้ว่าฉันรู้ว่าในสถานการณ์นี้ผู้ถามไม่มีตัวเลือก) rsyncเนื่องจากเป็นการง่ายกว่าที่จะดำเนินการต่อ ข้อได้เปรียบการบีบอัดกระแส


นี่เป็นคำตอบที่ถูกต้อง แต่จริงๆแล้วจะทำการถ่ายโอนไฟล์ครั้งละหนึ่งไฟล์เท่านั้น อย่างไรก็ตามมันจะใช้ประโยชน์จากแบนด์วิดธ์ที่มีอยู่อย่างเต็มที่และควรจะรันให้เร็วที่สุด
Benjamin Bannier

4

ใช้งานไม่ได้scp -r yourdir otherhost:/otherdir?

ลองใช้วิธีนี้:

tar cfz - . | ssh otherhost "cd /mydir; tar xvzf -"

z-flag เพื่อ tar ไม่บีบอัด หรือคุณสามารถใช้ -C เพื่อ ssh:

tar cf - . | ssh -C otherhost "cd /mydir; tar xvf -"

สิ่งที่ไม่-Cทำอะไร?
Nathan Fellman

1
ปัญหาคือฉันมีรายการไฟล์ ไฟล์จะถูกกระจายออกไปจำนวนมากของไดเรกทอรีและไฟล์ในไดเรกทอรีที่ไม่ทั้งหมดที่ฉันต้องการที่จะคัดลอก
ปีเตอร์สมิต

2
@Nathan: -C คือการปล่อยให้ ssh ทำการบีบอัด
Jimmy Hedman

1

ใน RHEL5 นี่เป็นวิธีเดียวที่เป็นไปได้ที่ฉันรู้ว่าจะคัดลอกรายการไฟล์ที่มีอักขระพิเศษ (เช่นเว้นวรรค) ได้อย่างปลอดภัย สร้างเชลล์สคริปต์และรวมต่อไปนี้:

FILE="/path/filename"
while read line; do
scp "$line" username@servername:/destination/
done < $FILE

0

มันสามารถทำได้โดยไม่มีปัญหามาก

ฉันเพียงแค่สร้างรายชื่อไฟล์ที่มีชื่อโฮสต์ถัดจากแต่ละไฟล์และดูเหมือนว่าจะแยกวิเคราะห์ได้ดี กล่าวคือ

srchost=`hostname`
myfiles="${srchost}:~/.bashrc ${srchost}:~/.bash_profile ${srchost}:~/.vimrc ${srchost}:~/.viminfo ${srchost}:~/.toprc ${srchost}:~/.dir_colors"
scp -v $myfiles $HOME

Scp ทำงานได้ดีกับไวยากรณ์นี้ ในขณะที่ฉันพยายามมันโดยไม่มีชื่อโฮสต์ถัดจากแต่ละไฟล์มันล้มเหลวหลังจากไฟล์แรก ฉันดูเหมือนจะจำไวยากรณ์อื่นที่ฉันเคยใช้มาก่อนหน้านี้และจะโพสต์เมื่อฉันหามัน


ใช้งานได้ แต่ค่อนข้างช้า - ดูเหมือนว่าจะเริ่มการเชื่อมต่อสำหรับแต่ละไฟล์ ... (ฉันมาที่นี่เพื่อหาวิธีแก้ปัญหาสำหรับสำเนาที่ช้า ... ) ~/ส่วนใหญ่จะถูกปล่อยออกไป - SCP ทำงานเมื่อเทียบกับไดเรกทอรีบ้าน .. หากคุณมีรายการจากที่อื่นใน$list: scp $(echo "$list"|sed "s/^/$srchost:/") local_destination(จะแบ่งชื่อไฟล์ที่มีช่องว่าง)
Gert van den Berg

-1

ฉันอยากจะแนะนำให้ส่วนต่าง ๆ ใช้คำสั่งเช่นนี้เพื่อสร้างการเก็บถาวรจากรายการไฟล์ของคุณ

tar -cvf allfiles.tar -L mylist.txt

จากนั้นใช้ scp เพื่อดาวน์โหลดไฟล์เก็บถาวร

ผู้ใช้ scp @ remotehost: ~ / allfiles.tar

/programming/8033857/tar-archiving-that-takes-input-from-a-list-of-files

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