เป็นไปได้หรือไม่ที่จะใช้คำสั่ง Unix เพื่อ cp ไฟล์ในไดเรกทอรีย่อยของฉันลงในคอมพิวเตอร์ระยะไกลผ่าน SSH


17

ฉันมีชุดของไฟล์ซอฟต์แวร์ที่ดาวน์โหลดลงในไดเรกทอรีย่อย~/Downloadsของฉันบนคอมพิวเตอร์ส่วนบุคคลของฉัน sshนอกจากนี้ผมยังใช้ทุบตีเชื่อมต่อระยะไกลกับคอมพิวเตอร์โดยใช้

เป็นไปได้หรือไม่ที่จะโอนไฟล์นี้sshไปยังคอมพิวเตอร์ระยะไกล?


คำถามหมายถึงไฟล์เอกพจน์ ( this file) และหลายไฟล์ ( a series of software files) วิธีที่ดีที่สุดขึ้นอยู่กับว่าคุณมีไฟล์เดียวหรือหลายไฟล์
2768

คำตอบ:


42

คุณอาจต้องการใช้scpเพื่อจุดประสงค์นี้ เป็นวิธีที่ปลอดภัยในการถ่ายโอนไฟล์โดยใช้โปรโตคอล SSH

ตัวอย่างเช่นในการคัดลอกไฟล์yourfile.txtจาก~/Downloadsไปยังคอมพิวเตอร์ระยะไกลให้ใช้:

scp ~/Downloads/yourfile.txt your_username@remotehost.edu:/some/remote/directory

คุณสามารถดูตัวอย่างเพิ่มเติมที่นี่


5
ฉันคิดว่าrsyncอาจใช้งานได้เช่นกันตอนนี้ที่ฉันคิดถึงมัน
ShanZhengYang

1
rsync อยู่ไกลเกินกว่าจะซับซ้อนเพียงแค่ไฟล์เดียวหรือเต็มไปด้วยมือ ...
Paebbels

14
@ Paebbels ในทางตรงกันข้ามแทนที่scpข้างต้นด้วยrsyncและมันควรจะทำงานได้ดี
8bittree

ฉันมักจะใช้rsyncกับทุกสิ่งแม้แต่ไฟล์เดียวเพราะมัน "ใช้งานได้" ในกรณีง่าย ๆ และอาจมีประสิทธิภาพมากกว่าในกรณีอื่น ๆ หากใช้อย่างใดอย่างหนึ่งscpหรือrsyncอย่างอื่นที่ไม่ได้บีบอัดและ / หรือเข้ารหัสโปรดอย่าลืมเปิดตัวเลือกการบีบอัด ( -Cสำหรับscp , -zหรือ--compressสำหรับrsync) ในความเป็นจริงฉันเปิดใช้งานตามนิสัย - เป็นเรื่องยากมากที่คุณจะพบสถานการณ์ที่เคยทำให้สิ่งต่าง ๆ ช้าลง (บางทีถ้าคุณกำลังใช้อุปกรณ์ที่ใช้พลังงานต่ำช้าซึ่งมีกำลัง CPI ที่ จำกัด เช่น rPi)
David Spillett

37

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

tar -c . | ssh <remote> tar -x

นี้จะtarไดเรกทอรีปัจจุบันในเครื่องท้องถิ่นและเขียนว่าtarไปstdoutซึ่งจะแล้วได้รับการประปาไปยังsshคำสั่งที่จะดำเนินการคำสั่งจากระยะไกลเพื่อ Untar ไฟล์มันอ่านจากstdin

แก้ไขเพื่อสะท้อนความคิดเห็นของ Dietrich Epp เกี่ยวกับ-f -การเป็นค่าเริ่มต้นทั้งในการสร้างและการแตกปลายดังนั้นจึงไม่จำเป็นต้องระบุอย่างชัดเจน


7
คุณอาจต้องการเพิ่ม-C basedirอาร์กิวเมนต์เพื่อtarแยกที่อื่นนอกเหนือจากไดเรกทอรีบ้านของคุณหากคุณทำเช่นนี้
Dougal

17

หากคุณต้องการทำสิ่งนี้มากกว่าโอกาสที่หายากฉันขอแนะนำให้ติดตั้งระบบไฟล์ระยะไกลด้วยsshfsหากคุณใช้ Unix-like ที่รองรับ FUSE (Linux, * BSD, Mac OS X) สร้างไดเรกทอรีภายใต้โฮมไดเรกทอรีของคุณพูดชื่อ ~ / remote-server:

    $ mkdir ~/remote-server

จากนั้นเมานต์ระบบไฟล์รีโมตด้วย sshfsแล้วติดตั้งระบบแฟ้มระยะไกลด้วยแทนที่ "yourserver.com" ด้วยชื่อโฮสต์ของเครื่องระยะไกลของคุณและ "ชื่อของไดเรกทอรีระยะไกล" ด้วยไดเรกทอรีที่คุณใช้ในระบบระยะไกล

    $ sudo sshfs username@yourserver.com:/name/of/remote/directory ~/remote-server/

เมื่อเสร็จสิ้นแล้วรีโมตไดเร็กทอรีจะเป็นส่วนหนึ่งของระบบไฟล์ของคุณและคุณสามารถใช้เครื่องมือปกติทั้งหมดของคุณได้รวมถึง cp :

    $ cp ~/Downloads/your-files ~/remote-server

หากคุณยังไม่ได้sshfsติดตั้งคุณควรจะสามารถติดตั้งลงในคอมพิวเตอร์ของคุณโดยใช้ตัวจัดการแพ็คเกจ (มองหาแพ็คเกจที่มีชื่อsshfsหรือfuse-sshfs) สำหรับข้อมูลเพิ่มเติมคุณสามารถอ่านบทช่วยสอนออนไลน์กวดวิชาออนไลน์

นี่เป็นวิธีที่ฉันชอบในการจัดการไฟล์บนเซิร์ฟเวอร์ระยะไกล ปกติฉันจะเก็บเซิร์ฟเวอร์ที่ใช้งานจริงหนึ่งตัวและเซิร์ฟเวอร์การพัฒนาสองตัวที่ติดตั้งด้วยวิธีนี้และใช้เวิร์กโฟลว์การเรียกดูไฟล์ปกติกับพวกเขา


จากนั้นตรวจสอบว่าตัวเลือก sshfs ใดที่จะช่วยให้คุณทำงานได้ดีที่สุด เช่นเริ่มต้นด้วยการจับคู่ ID ผู้ใช้ / กลุ่ม-o idmap={none,user,file},gid=<remote_user_group_ID>,allow_otherและ-Cสำหรับการบีบอัดถ้าแบนด์วิดธ์ต่ำ ทันทีที่ใช้งานได้ดีฉันจะเพิ่มนามแฝงสำหรับคำสั่งเพื่อติดตั้งระบบไฟล์ที่อยู่ห่างไกลผ่าน ssh อย่างรวดเร็ว @Benjamin_Staton ฉันจะไม่ใช้ sudo หรือ root ที่นี่ไม่ใช่อย่างน้อยถ้าไม่มีการแมปผู้ใช้ / กลุ่มที่เหมาะสม
tuk0z

9

ครั้งแรกไม่มีความแตกต่างระหว่างจริงscp(คัดลอกไปssh ) และrsyncและ

การเรียกใช้ครั้งต่อไปจะได้รับประโยชน์จาก rsync ไม่ใช่การคัดลอกไฟล์ที่มีอยู่แล้ว

rsync -avH ~/Downloads  username@remotehost:Downloads
  • -a สำหรับไฟล์ทั้งหมด
  • -v สำหรับ verbose
  • -H สำหรับ "เพียงแค่หา symlink และทำสิ่งที่ถูกต้อง"
  • เส้นทางที่มาและปลายทาง คุณสามารถใช้อักขระตัวแทนในแหล่งที่มาหรือเพียงแค่ซิงค์ไดเรกทอรีทั้งหมด

ธงที่มีประโยชน์อื่น ๆ ได้แก่ :

  • --delete เพื่อลบไฟล์ในปลายทางที่ไม่มีอยู่ในแหล่งที่มาอีกต่อไป
  • --dry-run สำหรับการทดสอบ - --deleteมีประโยชน์มากเมื่อรวมกับ

การทำเช่นนี้จะใช้sshกุญแจในการเข้าสู่ระบบแบบไม่ใช้รหัสผ่านเช่นกันหากคุณตั้งค่าไว้

ในตอนท้ายของการเรียกใช้rsyncจะบอกให้คุณทราบว่าการทำสำเนาแบบธรรมดาซ้ำแล้วซ้ำอีกหลายครั้ง


1
-Hจริงๆแล้วสำหรับฮาร์ดลิงก์มันจะหยุดเนื้อหาเดียวกันที่ถูกส่งสองครั้งหรือมากกว่าเมื่อมันถูกลิงค์ไปยังมากกว่าหนึ่งแห่งในโครงสร้างไดเรกทอรีต้นทาง (แต่สามารถทำให้กระบวนการมีประสิทธิภาพน้อยลงสำหรับโครงสร้างไดเรกทอรีขนาดใหญ่) มันไม่มีผลต่อลิงก์สัญลักษณ์ แต่ตัวเลือกบางตัวที่รวมโดย-a/ --archiveไม่ส่งผลกระทบต่อวิธีการประมวลผล symlink
David Spillett

4

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

หากคุณต้องการให้บางสิ่งบางอย่างซิงค์อยู่เสมอและแม้แต่ต้องการเรียกใช้ไฟล์บางไฟล์ในเครื่องที่อยู่บนเครื่องระยะไกลก็sshfsทำได้ดี


-1

ฉันทำอะไรที่คล้ายกับ ssh ฉันสร้างเครื่องมือสร้างแบบกำหนดเองสำหรับ Visual Studio และฉันมี VS รันคำสั่ง ssh ที่คัดลอกรหัสของฉันไปยังคอมพิวเตอร์เป้าหมายแล้วคอมไพล์มันบนคอมพิวเตอร์เป้าหมายนั้น

ssh userB @ hostB 'cp /network/path/of/source/file.ext /path/of/final/file.ext; ./runCustomCommand'

สังเกตการใช้เครื่องหมายคำพูดเดี่ยวและเซมิโคลอน อดีต encapsulate คำสั่งของคุณเพื่อ hostB ผ่าน ssh และหลังช่วยให้คุณสามารถเรียกใช้หลายคำสั่งระบบ hostB ในหนึ่งคำสั่ง ssh จาก hostA

ในการทำงานนี้คุณจะต้องตั้งค่าคีย์ ssh บนเครื่องเริ่มต้นของคุณเพื่อให้คุณสามารถเป็น userA @ hostA และลงชื่อเข้าใช้ hostB ในฐานะผู้ใช้ B กระบวนการในการสร้างคีย์สาธารณะ ssh สำหรับ userA @ hostA นั้นได้รับการบันทึกไว้เป็นอย่างดี หากคุณไม่ได้สร้างพับลิกคีย์บน hostA สำหรับ userA และคัดลอกคีย์นั้นไปยังโฮสต์ B ในฐานะผู้ใช้ B คุณจะถูกบังคับให้ใส่รหัสผ่านของคุณทุกครั้ง


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