ฉันไม่สามารถ sftp ลงในโฮสต์ได้โดยตรง ในการย้ายไฟล์จากเครื่องที่บ้านของฉันไปยังโฮสต์ฉันต้อง sftp ไฟล์ไปยังโฮสต์ระดับกลาง ssh เข้าสู่โฮสต์ระดับกลาง และ sftp ไฟล์ไปยังปลายทางสุดท้าย เป็นไปได้ไหมที่จะหลีกเลี่ยงความบ้าคลั่งเช่นนี้?
ฉันไม่สามารถ sftp ลงในโฮสต์ได้โดยตรง ในการย้ายไฟล์จากเครื่องที่บ้านของฉันไปยังโฮสต์ฉันต้อง sftp ไฟล์ไปยังโฮสต์ระดับกลาง ssh เข้าสู่โฮสต์ระดับกลาง และ sftp ไฟล์ไปยังปลายทางสุดท้าย เป็นไปได้ไหมที่จะหลีกเลี่ยงความบ้าคลั่งเช่นนี้?
คำตอบ:
จากเครื่องโลคัลของคุณคุณสามารถสร้างช่องสัญญาณ SSH ผ่านโฮสต์ระดับกลางถึงโฮสต์สุดท้าย:
ssh user@intermediate -L 2000:final:22 -N
สิ่งนี้จะเปิดพอร์ต 2000 บนโลคัลโฮสต์ของคุณที่จะเชื่อมต่อโดยตรงไปยังเซิร์ฟเวอร์สุดท้ายในพอร์ต 22 โดยการเจาะผ่านโฮสต์ระดับกลาง ในตอนนี้ให้เชื่อมต่อกับ sftp บนพอร์ต 2000 อีกครั้งเพื่อรับสัญญาณผ่านไปยังเซิร์ฟเวอร์สุดท้ายโดยสังเกตว่าผู้ใช้ที่ระบุที่นี่เป็นโฮสต์สุดท้าย:
sftp -P 2000 user@localhost
ดูเหมือนว่านี้อยู่ในsuperuser.comหรือserverfault.comแม้ว่า
คุณสามารถใช้ตัวเลือก ProxyCommand ของ SFTP เพื่อสร้างช่องสัญญาณการเชื่อมต่อ SFTP ที่โปร่งใสผ่านการเชื่อมต่อ SSH (คล้ายกับคำตอบของ WhiteFang34 แต่เหนือ stdin & stdout ของการเชื่อมต่อ SSH แทนที่จะเป็นพอร์ต TCP ภายในเครื่องที่ส่งต่อ):
sftp -o "ProxyCommand=ssh -e none user@intermediatehost exec /usr/bin/nc %h %p 2>/dev/null" user@finalhost
(นั่นคือสมมติว่าโฮสต์ระดับกลางติดตั้ง netcat เป็น / usr / bin / nc - หากไม่ใช่คุณอาจต้องค้นหา / ติดตั้งวิธีที่เทียบเท่าในการเกตเวย์ stdin & stdout ในเซสชัน TCP)
สิ่งที่เจ๋งจริงๆเกี่ยวกับตัวเลือกนี้คือคุณสามารถเพิ่มลงในไฟล์ ~ / .ssh / config ของคุณซึ่งทำให้มันโปร่งใส:
Host finalhost
ProxyCommand ssh -e none user@intermediatehost exec nc %h %p 2>/dev/null
ด้วยรายการดังกล่าวคุณสามารถใช้ sftp, scp และ ssh เพื่อ finalhost และมันจะเรียกใช้อุโมงค์โดยอัตโนมัติ ส่วนที่ไม่โปร่งใสเพียงอย่างเดียวคือมันจะถามรหัสผ่านสองอัน (middlehost ตามด้วย finalhost) แต่ถ้าคุณต้องการคุณสามารถกำจัดมันได้ด้วย SSH keypairs ...
exec
จำเป็น? (ใช้งานได้ดีที่นี่โดยไม่มีส่วนนั้น)
คุณสามารถไพพ์ข้อมูลไปยังกระบวนการ ssh ที่รันบนเครื่องของคุณจากนั้นรันคำสั่งบนเครื่องระดับกลางซึ่งอ่าน stdin และส่งไปยัง sftp ตามความเหมาะสม
สิ่งนี้สามารถทำได้ใน oneliner บนเครื่องของคุณแม้ว่าการอ้างถึงข้อโต้แย้งกับ ssh จะต้องได้รับการดูแล ตอนนี้ฉันอยู่ในโทรศัพท์ของฉันดังนั้นจึงไม่สามารถพิมพ์รายละเอียดได้ บางทีคนอื่นอาจทำคำตอบนี้ให้สมบูรณ์ในแบบฝึกหัด!
ฉันสมมติว่าโฮสต์สุดท้ายมีไฟร์วอลล์และฉันสามารถเดาได้เฉพาะวิธีที่คุณสามารถใช้เพื่อแก้ไข
ตัวอย่างเช่น - เปิดเผย ssh จากเครื่องโลคัลของคุณจากนั้น ssh ไปยังโฮสต์แรกจากนั้น ssh ไปที่สองและ sftp จากโฮสต์สุดท้ายไปยังเครื่องของคุณ
สมมติว่า A และ B เป็นโฮสต์ตัวแรกและตัวที่สอง และไฟล์ที่จะทำการคัดลอกนั้นเป็น foo
แทนที่จะเป็น SFTP คุณสามารถใช้สิ่งต่อไปนี้
แมวฟู | ssh A "cat -> foo"
ทีนี้คุณสามารถ daisy-chain 2 ของเหล่านี้เข้าด้วยกัน
แมวฟู | ssh A "cat - | ssh B \" cat -> foo \ ""