ถ่ายโอนไฟล์ผ่านเซสชัน SSH แบบสองฮอป


6

ฉันมีกล่อง Linux ในที่ทำงานที่ฉันมักจะเข้าสู่ระบบจากที่บ้าน กล่อง Linux อยู่บนเครือข่ายภายใน แต่มีกล่องที่ครอบคลุมทั้งสองเครือข่ายดังนั้นฉันจึงสามารถเข้าสู่ระบบได้เช่น:

ssh -tA username@bridge.work.com ssh username@10.10.10.130

ฉันมีไฟล์สองไฟล์นั่งอยู่ใน ~ / tmp ที่ฉันต้องการคัดลอกไปยังเครื่องของฉัน (เราเรียกมันว่า ~ / tmp / file1 ~ / tmp / file2 และ ~ / tmp / file3 เพื่อการโต้แย้ง)

ฉันเห็นบางสิ่งบางอย่างเช่นงานนี้:

ssh -tA username@bridge.work.com ssh username@10.10.10.130 'tar cf - ~/tmp/file*' | tar xf -

สิ่งนี้จะ tar ไฟล์บนเครื่องรีโมตส่งผลลัพธ์ไปยัง stdout จากนั้นไพพ์ผลลัพธ์ไปยัง tar แบบโลคัลซึ่งกำลังคลายข้อมูลบน stdin โลคัล

ใช้งานไม่ได้:

บนเครื่องระยะไกลถ้าฉันเรียกใช้

tar cf - tmp/file* | md5sum
f1b776364c10dfc20500f228399a7c63  -

จากเครื่องท้องถิ่น:

ssh -tA username@bridge.work.com ssh username@10.10.10.130 'tar cf - ~/tmp/file*' | md5sum
bc7436c9771ee2b4978ffd29b8b7ed36  -

ฉันสมมติว่านี่น่าจะเป็น byte สั่ง snafu ผ่านเครือข่าย ... ในที่สุดฉันก็สามารถที่จะรับมันได้โดย uuencoding ไฟล์ catting มันข้ามเครือข่ายแล้ว uudecoding มันในเครื่อง ... ด้วยเหตุผลบางอย่างที่ฉันทำไม่ได้ รับไวยากรณ์ที่ถูกต้องเพื่อให้สามารถ tar | uuencode บนรีโมทและ uudecode | untar ในด้านท้องถิ่น

ฉันกำลังมองหาวิธีที่ดีในการทำทั้งหมดนี้ในขั้นตอนเดียว โดยเฉพาะอย่างยิ่งสิ่งที่ฉันสามารถห่อในฟังก์ชั่นเปลือก

คำตอบ:


6

ใช้ตัวเลือกการกำหนดค่า SSH ProxyCommand เพื่อในการกำหนดค่าบนไคลเอนต์ของคุณ สิ่งนี้ช่วยให้คุณทำการเชื่อมต่อโดยตรงไปยังปลายทาง

Host remotebox
    ProxyCommand /usr/bin/ssh username@bridge.work.com "/bin/netcat -w 1 10.10.10.130 22"
    User username

scp remotebox: ไฟล์ในเครื่อง


อืมมม ฉันกำลังทุบตี: / bin / netcat: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว
Barton Chittenden

โดยวิธีการที่ฉันชอบวิธีนี้จริงๆ ... ฉันไม่เคยเล่นกับคำสั่ง 'ProxyCommand' และมันทำให้ฉันอยากรู้ ฉันจะทำเครื่องหมายว่านี่เป็นคำตอบที่ได้รับการยอมรับว่าได้ผลออกมาจากกล่อง ขอบคุณสำหรับการศึกษา
Barton Chittenden

จำเป็นต้องติดตั้ง netcat บนกล่องบริดจ์ของคุณ มันเป็นเครื่องมือทั่วไปที่ค่อนข้างสวย
Zoredache

เอเอชเอ มันติดตั้งเป็น / usr / bin / netcat บนกล่องบริดจ์
Barton Chittenden

... และ scp ทำงาน ไชโย!
Barton Chittenden

6

คุณสามารถตั้งค่าการส่งต่อพอร์ต เปลี่ยนคำสั่ง inital ของคุณเป็น:

ssh -TA username@bridge.work.com -L 2222:10.10.10.130:22

จากนั้นเพิกเฉยคำสั่งนี้ เปิดเทอร์มินัลใหม่และเรียกใช้หนึ่งใน:

ssh -p 2222 username_for_10.10.10.130@127.0.0.1
scp -P 2222 username_for_10.10.10.130@127.0.0.1 remote_file local_file

เมื่อใดก็ตามที่ระบบโลคัลของคุณได้รับการร้องขอการเชื่อมต่อบนพอร์ตที่อยู่ IP localhost 2222 คำสั่ง SSH ที่คุณรันก่อนจะส่งต่อไปยังระบบรีโมตและส่งการร้องขอการเชื่อมต่อไปที่ 10.10.10.130 นี่คือทั้งหมดที่ระบุโดยสวิตช์ -L


4

การสั่งซื้อแบบไบต์จะใช้กับสิ่งต่าง ๆ เช่นส่วนหัวของ IP (ซึ่งมีที่อยู่ขนาดสี่ไบต์เป็นหน่วยเดียว) แต่ไม่มีผลต่อโปรโตคอลระดับสูงกว่าซึ่งทำงานกับ 8 บิตไบต์เท่านั้น - IP, TCP และ SSH ทั้งหมด รับประกันว่าคุณจะได้รับข้อมูลตรงตามที่ส่งมาไบต์ต่อไบต์

ปัญหาที่เกิดขึ้นเกิดจากการที่ตัวเลือกแรก-t sshมันบังคับให้จัดสรร pseudo-tty สำหรับการเชื่อมต่อครั้งแรกซึ่งจำเป็นเฉพาะสำหรับเทอร์มินัล (และเทอร์มินัลอีมูเลเตอร์) และจะทำการรวมข้อมูลบางอย่างระหว่างการถ่ายโอน โดยเฉพาะอย่างยิ่งการขึ้นบรรทัดใหม่ (0x0D) จะถูกแทรกโดยอัตโนมัติก่อนที่ทุกบรรทัด (0x0A)

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


มันใช้งานได้ ... ฉันได้ไฟล์ tar ที่ดีในด้านโลคัล น่าแปลกที่ความแตกต่างใน md5sum คือปลาเฮอริ่งแดง: ทุกครั้งที่ฉันวิ่ง 'tar zcf - / home / ชื่อผู้ใช้ / tmp / ไฟล์ * | md5sum 'บนเครื่องระยะไกลฉันได้รับ md5sum ที่แตกต่างกัน
Barton Chittenden

2
@Barton: ไม่มันไม่ใช่ การทดสอบคำถามของคุณทำโดยใช้ tar ธรรมดาซึ่งมักจะส่งออกข้อมูลเดียวกันสำหรับไดเรกทอรีเดียวกันและผลลัพธ์ในแฮชเดียวกันเช่นกัน (ข้อมูลของคุณได้รับความเสียหายจาก SSH) อย่างไรก็ตามสิ่งที่อยู่ในความคิดเห็นของคุณจะบีบอัดเอาต์พุตด้วยzตัวเลือกgzip (the ) ซึ่งฝังการประทับเวลาปัจจุบันในส่วนหัว gzip ทำให้แฮชแตกต่างกันทุกครั้ง
grawity

มโนหร เหตุใดจึงเป็นเช่นนี้เฉพาะในกรณีที่ tar gzips ไฟล์เท่านั้น ถ้าฉันสร้าง 'asdf.txt' และเรียกใช้ 'gzip -c asdf.txt | md5sum 'สองครั้งติดต่อกันฉันจะได้รับ checksum เดียวกัน ... โอ้ ... ฉันเข้าใจแล้ว ... ส่วนหัว gzip เก็บ mtime ของไฟล์ที่กำลัง gzipped ... ถ้าเป็นไฟล์ tar ที่สร้างขึ้นใหม่แตกต่างกัน mtime
Barton Chittenden

@Barton: ในกรณีนี้ "mtime" เป็นจริงเวลาระบบปัจจุบัน เมื่อคุณใช้ gzip ผ่านtar -zไม่มี "tar file"; มีเฉพาะสตรีมแบบไม่ระบุชื่อที่ tar เอาท์พุทและ gzip บีบอัด
grawity

ฉันยังพบว่า-tมีการทำให้เกิดความสับสนในกระแสข้อมูล ปัญหาคือฉันต้องการกำหนดเชลล์สคริปต์หรือนามแฝงเป็นssh -[t]A bridge.work.com ssh 10.10.10.130และฉันต้องการสองของพวกเขาสำหรับการโต้ตอบและไม่โต้ตอบแต่ละ!
musiphil
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.