scp ระหว่างโฮสต์ระยะไกลสองแห่งจากพีซี (สาม)


136

ฉันมีโฮสต์ระยะไกลสองตัว
host1-> 10.3.0.1
host2-> 10.3.0.2
ทั้งคู่รันเซิร์ฟเวอร์ ssh

เซิร์ฟเวอร์ ssh ฟังพอร์ต 22 ในโฮสต์ 1 และบนพอร์ต 6969 ในโฮสต์ 2 ตอนนี้ใช้เครื่องของฉันฉันต้องคัดลอกบางอย่างจาก host1 ไปยัง host2 โดยไม่ต้องเข้าสู่ host1 หรือ host2 ผ่าน ssh สิ่งที่ต้องการ,

scp user@10.3.0.1:/path/to/file user@10.3.0.2/path/to/file

ฉันจะทำสิ่งนี้ได้อย่างไรโปรดทราบว่าโฮสต์ทั้งสองใช้พอร์ตต่าง ๆ สำหรับ ssh


คุณกำลังถามว่าคุณสามารถถ่ายโอนจากโฮสต์ระยะไกลไปยังโฮสต์ระยะไกลหรือคุณถามว่าจะทำอย่างไรโดยไม่ต้องใส่รหัสผ่าน?
เกล็นแจ็

ในขณะที่มีการ-Pตั้งค่าสถานะเพื่อระบุพอร์ตที่จะใช้ในกรณีของการถ่ายโอนระยะไกลถึงระยะไกล ssh เป็นพฤติกรรมที่ไม่ได้กำหนดไว้ในวิธีการระบุพอร์ตต่อโฮสต์ ...
mveroone

คำตอบ:


216

ในอดีตวิธีการscpทำงานเมื่อมีการเรียก ( ไร้เดียงสา ) เพื่อคัดลอกไฟล์ระหว่างระบบรีโมตนั้นไม่สะดวกเช่นถ้าคุณเขียนเช่น

    scp user1@remote1:/home/user1/file1.txt user2@remote2:/home/user2/file1.txt

scpจะเปิดsshเซสชันใน remote1 ก่อนจากนั้นจะเรียกใช้scpจากที่นั่นไปยัง remote2 เพื่อให้สามารถใช้งานได้คุณจะต้องตั้งค่าหนังสือรับรองการอนุญาตสำหรับ remote2 บน remote1

วิธีการที่ทันสมัยที่จะทำแทน ("ทันสมัย" เพราะมันถูกนำมาใช้เพียงไม่กี่ปีที่ผ่านมาและอาจไม่ใช่ทุกคนที่มี-3-capable scp) ต้องใช้สองขั้นตอน ขั้นตอนแรกที่จำเป็นคือการใช้~/.ssh/configการตั้งค่าตัวเลือกทั้งหมดสำหรับการเชื่อมต่อกับ remote1 และ remote2 ดังต่อไปนี้:

    Host remote1.example.org
    Port 2222
    IdentityFile /path/to/host1-id_rsa

    Host remote2.example.org
    Port 6969
    IdentityFile /path/to/host2-id_rsa

วิธีนี้จึงเป็นไปได้ที่จะผ่านตัวเลือกที่จำเป็นทั้งหมดเพื่อคำสั่งโดยไม่ต้องงงงวย : ยกตัวอย่างเช่นถ้าเราได้กล่าวว่าใน CLI พอร์ตการใช้งาน 2222โดยไม่ต้องกำหนดค่าข้างต้นก็จะได้รับความชัดเจนว่าเรากำลังหมายถึงREMOTE1หรือremote2และ เช่นเดียวกันสำหรับไฟล์ที่มีคีย์ cryptgraphic วิธีนี้ CLI ยังคงเป็นระเบียบและเรียบง่าย

ประการที่สองใช้-3ตัวเลือกดังนี้:

    scp -3 user1@remote1:/home/user1/file1.txt user2@remote2:/home/user2/file1.txt

-3ตัวเลือกสั่งscpการจราจรเส้นทางผ่านเครื่องคอมพิวเตอร์ที่คำสั่งจะออกแม้ว่ามันจะเป็นบุคคลที่ 3 ที่จะโอน วิธีนี้ข้อมูลประจำตัวการให้สิทธิ์จะต้องอยู่ในพีซีที่ออกซึ่งเป็นบุคคลที่สามเท่านั้น


6
สำหรับการอ้างอิงในอนาคต: หากคุณคัดลอกไฟล์ระหว่างสองโฮสต์ที่แชร์ไฟล์ข้อมูลประจำตัว (เช่นอินสแตนซ์ EC2) คุณไม่จำเป็นต้องใช้ไฟล์ปรับแต่ง อาร์กิวเมนต์ -i เดียวเพียงพอที่จะเชื่อมต่อกับโฮสต์ทั้งสอง
Artur Czajka

1
นอกจากนี้ที่น่าสังเกตก็คือสำหรับ Google Compute Engine มีการรองรับการเพิ่ม~/.ssh/configไฟล์ของคุณ: cloud.google.com/compute/docs/gcloud-computeแต่ฉันไม่คิดว่า AWS มีการสนับสนุนเดียวกัน
modulitos

1
เพราะคุณจะไม่เห็นผลลัพธ์ที่คุณทำตามปกติเคล็ดลับคือการเปิดใช้งานโหมด verbose -vกับ
holmberd

6

ครั้งล่าสุดที่ฉันลองทำเช่นนี้ scp ไม่สามารถทำได้ บรรทัดคำสั่งของคุณดูโอเค วิธีแก้ปัญหานี้จะทำงาน:

ssh -p port_on_machine1 user@machine1 "cat /path/to/file/one"|ssh -p port_on_machine2 user@machine2 "cat >/path/to/file/two"

หน้า man ของ scp ของฉันบอกว่า "อนุญาตให้ทำสำเนาระหว่างโฮสต์ระยะไกลสองแห่งด้วย"
เกล็นแจ็

1
ขอบคุณมันดีที่ได้ยิน หากต้องการ scp คุณสามารถให้แฟล็ก -P (เขียนโดยคน BSD บางคนนี่เป็นเพราะการจัดการอาร์กิวเมนต์มันน่าเศร้ามาก :-() แต่ดูเหมือนว่าคุณไม่สามารถระบุพอร์ตที่แตกต่างกันในโฮสต์ระยะไกลได้ฉันขอโทษ แต่ฉันคิดว่ามีเพียงวิธีแก้ปัญหา lefts นี้เท่านั้น (หรือมีวิธีการแก้ปัญหาที่ยุ่งยากมากโดยใช้ ssh แต่หลีกเลี่ยง scp - ตัวอย่างเช่น sftpfs แต่ไม่ใช่วิธีที่ง่ายที่สุด) ฉันขยายวิธีแก้ปัญหาด้วยการตั้งค่าพอร์ต
user259412

4

ในกรณีของฉันฉันทำรีโมตไปยังรีโมตสำเนาโดยไม่-3โต้แย้ง พอร์ตที่กำหนดด้วยพารามิเตอร์ '-P' จะทำงานกับเซิร์ฟเวอร์ที่ 1 แต่จะใช้พอร์ต 22 กับเซิร์ฟเวอร์ที่ 2

ssh -P 1234 user@server1.mydomain.com user@server2.otherdomain.com

ทางออกคือการแก้ไข/etc/ssh/ssh_configไฟล์server1และเพิ่มบรรทัดเหล่านี้:

Host *.otherdomain.com
   Port  1234

ด้วยวิธีนี้พอร์ต 1234 ใช้สำหรับทั้งคู่ มันอาจแตกต่างกันเช่นกัน

โซลูชันนี้มีปริมาณงานที่ดีกว่าโซลูชันก่อนหน้าเนื่องจากการสื่อสารโดยตรง


เปเรซมีวิธีในการบรรลุ scp ผ่านสองพอร์ตที่แตกต่างกันสำหรับสองเครื่องระยะไกลที่แตกต่างกันจากสาย comman หรือไม่?
ขวดแดง

4

แหล่งที่มาและเป้าหมายสามารถระบุเป็น URI ในรูปแบบ scp: // [user @] host [: port] [/ path]

เพื่อให้คุณสามารถเรียกใช้:

scp -3 scp://user@10.3.0.1:22/path/to/file scp://user@10.3.0.2:6969/path/to/file
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.