รับไฟล์จากเซิร์ฟเวอร์สองขั้นตอน [ปิด]


14

เรามีสถานการณ์ต่อไปนี้:

  1. เครื่องของฉัน
  2. เครื่องเกตเวย์
  3. เครื่องเป้าหมาย

ฉันไม่มีสิทธิ์รูททั้ง # 2 และ # 3 ฉันยังไม่สามารถจัดเก็บข้อมูล (ไม่เกิน 200 MiB) บนเครื่อง # 2 (เนื่องจากเป็นประตูสู่ส่วนที่เหลือของเครือข่ายไม่ใช่มากกว่านั้น) บนเครื่อง # 3 มีโฟลเดอร์ขนาดประมาณ 3 GiB ที่ฉันต้องการคัดลอกไปยังเครื่อง ฉันไม่สามารถ SSH จาก # 1 ถึง # 3 แต่ฉันสามารถ SSH ถึง # 2 จากนั้นเป็น # 3 ไม่สามารถตั้งค่าคีย์สาธารณะส่วนตัวระหว่าง # 2 และ # 3 แต่มีการติดตั้ง keypair ระหว่าง # 1 ถึง # 2

ปกติฉันจะใช้การรวมกันของ SSH และ tar เพื่อทำสิ่งนี้ให้สำเร็จ:

ssh name@host "tar cf - folder" > folder.tar

แต่ในกรณีนี้จะต้องมีการทำรังบางอย่างและฉันไม่สามารถทำสิ่งนี้ได้

ดังนั้นวิธีที่ดีในการรับข้อมูลจาก # 3 ถึง # 1 คืออะไร

คำตอบ:


27

คุณสามารถสร้างอุโมงค์ SSH ผ่าน machine2 จากนั้นในเซสชันอื่นเชื่อมต่อกับอุโมงค์

ตัวอย่างเช่นเปิดสองเซสชัน CLI บน machine1 ในเซสชั่นแรกทำงานต่อไปนี้:

MACHINE1$ ssh -L 2022:MACHINE3:22 <user>@MACHINE2

ในเซสชั่นที่สองเรียกใช้ต่อไปนี้:

MACHINE1 $ ssh -p 2022 <user>@localhost

สิ่งที่เกิดขึ้นกับคำสั่งแรกคือโลคัลพอร์ต (2022 บน machine1) กำลังถูก tunneled ไปยังพอร์ต 22 บน machine3 โดยใช้การเชื่อมต่อ SSH ของคุณกับ machine2

ด้วยคำสั่งที่สองคุณกำลังเชื่อมต่อกับพอร์ตท้องถิ่นที่เพิ่งเปิดใหม่ (2022) และเหมือนคุณกำลังเชื่อมต่อโดยตรงกับ machine3

ตอนนี้ถ้าคุณต้องการใช้กระบวนการถ่ายโอนไฟล์ทั่วไปคุณสามารถทำสิ่งต่อไปนี้:

ssh -p 2022 <user>@localhost "tar cf - /path/to/remote/directory/" > filename.tar

คุณสามารถทำความคุ้นเคยกับ rsync และทำสิ่งนี้แทน:

rsync -aHSv --progress -e 'ssh -p 2022' <user>@localhost:/path/to/remote/directory/ /path/to/local/directory/

สมมติว่าเป้าหมายสุดท้ายไม่ได้รับ tarball


2
การใช้ProxyCommandและคำสั่งssh -Wทั้งสองsshสามารถรวมกันเป็นบรรทัดคำสั่งเดียว หากคุณมีไคลเอนต์ OpenSSH เวอร์ชันล่าสุดมีข้อโต้แย้งที่จะช่วยให้คุณทำได้ด้วยsshคำสั่งเดียว
kasperd

+1 สำหรับ rsync;)
NieDzejkob

ฉันใช้ tar เพราะการถ่ายโอนไฟล์จำนวนมากใช้เวลานานกว่านั้นจึงถ่ายโอนไฟล์ขนาดใหญ่หนึ่งไฟล์ rsync แก้ปัญหานี้ได้หรือไม่?
Cheiron

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

5

คุณยังสามารถใช้ความสามารถเซสชันหลักของ SSH เวอร์ชันที่ใหม่กว่า มันอธิบายไว้ที่นี่:

https://en.wikibooks.org/wiki/OpenSSH/Cookbook/Multiplexing

สิ่งที่คุณต้องการคือการแก้ไข / สร้าง. ssh / config เพิ่มคำจำกัดความที่ควบคุมเซสชันต้นแบบ:

ControlMaster auto
ControlPath ~/.ssh/cm_socket/%r@%h:%p
ControlPersist 4h
ServerAliveInterval 30

จากนั้นคุณสามารถระบุนิยามเซิร์ฟเวอร์ hop แรกของคุณเช่น:

Host first_hop
Hostname <your first host FQDN or IP>
User <your user>

และ hop ที่สองจะใช้เซิร์ฟเวอร์ hop แรกของคุณเป็น proxy:

Host second_hop
Hostname <your second host FQDN or IP>
User <your user>
ProxyCommand ssh -W %h:%p first_hop

อย่าลืมสร้างไดเรกทอรี ~ / .ssh / cm_socket และการอนุญาตให้กำหนดค่าควรเป็น 644

จากนั้นคุณควรจะสามารถ SSH หรือ SCP โดยตรงไปยัง / จากเซิร์ฟเวอร์ที่สองของคุณ อาจมีเซิร์ฟเวอร์เพิ่มขึ้นเช่นนี้


3
จากการอ่านลิงค์ของคุณฉันไม่คิดว่าControlMasterจะต้องใช้มัลติเพล็กซ์ / เพื่อการแสดงความคิดเห็น หน้าเว็บที่เกี่ยวข้องเพิ่มเติมใน wikibook นั่นคือหน้านี้: en.wikibooks.org/wiki/OpenSSH/Cookbook/Proxies_and_Jump_Hosts
IMSoP

ใช่ฉันเห็นด้วย. มีหลายวิธี อย่างไรก็ตามฉันคิดว่าเซสชั่นปริญญาโทที่สง่างามที่สุด มันเป็นเพียงการตั้งค่าส่วนตัว ;-)
Jaroslav Kucera

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