ฉันจะดาวน์โหลดไฟล์จากโฮสต์ที่ฉันสามารถใช้ SSH ผ่านโฮสต์อื่นได้อย่างไร


30

ฉันต้องการดาวน์โหลดไฟล์จากคอมพิวเตอร์ที่ทำงานไปยังแล็ปท็อปของฉัน

ฉันสามารถเชื่อมต่อเครื่องในสำนักงานของฉันด้วย SSH ไปยังเซิร์ฟเวอร์องค์กรและจากนั้น SSH จากเซิร์ฟเวอร์ไปยังเครื่องที่ทำงานของฉัน

คำสั่งเดียวที่เซิร์ฟเวอร์องค์กรยอมรับคือ ssh, ssh1 และ ssh2

ฉันจะดาวน์โหลดไฟล์จากเครื่องที่สำนักงาน (ระยะไกล) ผ่านเซิร์ฟเวอร์ไปยังเครื่องแล็ปท็อปของฉันได้อย่างไร


2
ใช้อุโมงค์ SSH ย้อนกลับหรือไม่? ดูคำตอบของฉันที่นี่และปรับใช้ตามความจำเป็น: superuser.com/questions/1186905/…
Darren

1
SSH แบบหลายฮอป?
mckenzm

คำตอบ:


37

คำตอบก่อนหน้านี้กล่าวถึงวิธีการใช้คำสั่ง ProxyJump (เพิ่มใน OpenSSH 7.3) เพื่อเชื่อมต่อผ่านเซิร์ฟเวอร์กลาง (โดยปกติจะเรียกว่าโฮสต์ bastion) แต่พูดถึงมันเป็นอาร์กิวเมนต์บรรทัดคำสั่ง

~/.ssh/configเว้นแต่จะเป็นเครื่องที่คุณจะไม่ได้รับการเชื่อมต่อในอนาคตสิ่งที่ดีที่สุดคือการที่คุณกำหนดค่าบน

ฉันจะใส่ไฟล์เช่น:

Host office-machine
Hostname yochay-machine.internal.company.local
ProxyJump bastion-machine

Host bastion-machine
Hostname organization-server.company.com
...

หากคุณกำลังใช้ OpenSSH เวอร์ชันก่อนหน้าซึ่งไม่สนับสนุน ProxyJump คุณจะแทนที่ด้วยเทียบเท่า:

ProxyCommand ssh -W %h:%p bastion-machine

และถ้าเวอร์ชั่น ssh ในท้องที่ของคุณเป็นรุ่นโบราณที่ไม่สนับสนุน-W:

ssh bastion-machine nc %h %p

แม้ว่าอันสุดท้ายนี้จะต้องncติดตั้งเครื่องป้อมปราการ

ความสวยงามของ ssh คือคุณสามารถกำหนดค่าแต่ละปลายทางบนไฟล์ได้และมันจะมีความสวยงามมาก ดังนั้นคุณจะทำงานร่วมกับoffice-machineชื่อโฮสต์ในเครื่องมือทั้งหมด (ssh, scp, sftp ... ) ในขณะที่พวกเขากำลังเชื่อมต่อโดยตรงและพวกเขาจะรู้วิธีการเชื่อมต่อใน ssh_config คุณสามารถมีไวลด์การ์ดHost *.internal.company.localเพื่อให้ไพร่พลทั้งหมดจบลงเช่นนั้นผ่านป้อมปราการที่เฉพาะเจาะจงและมันจะใช้กับพวกมันทั้งหมด เมื่อกำหนดค่าอย่างถูกต้องความแตกต่างเพียงอย่างเดียวระหว่างทำการเชื่อมต่อ hop หนึ่งครั้งหรือยี่สิบครั้งจะเป็นการเชื่อมต่อที่ช้าลง


36

หากคุณมี OpenSSH ล่าสุด (8.0) คุณสามารถใช้-Jสวิตช์ (กระโดด) :

scp -J user@intermediate user@target:/path

ด้วยเวอร์ชันที่เก่ากว่า (แต่อย่างน้อย 7.3) คุณสามารถใช้ProxyJumpคำสั่งได้ทั้งบนบรรทัดคำสั่ง:

scp -o ProxyJump=user@intermediate user@target:/path

หรือในssh_configไฟล์ตามที่คำตอบของ @ Ángelแสดง


มีตัวเลือกอื่น ๆ เช่นProxyCommandหรือการส่งต่อพอร์ตซึ่งคุณสามารถใช้กับ OpenSSH เวอร์ชันที่เก่ากว่าได้ สิ่งเหล่านี้กล่าวถึงในOpenSSH รองรับการลงชื่อเข้าใช้แบบหลายคนหรือไม่?


2
@yochaymaganssh -J userA@orgserv userB@officecomp cat remote/path > local/path
mosvy

4
สำหรับ scp จะมีการเพิ่มใน 7.10
Ángel

4
แม้ว่าscpจะไม่ได้รับการสนับสนุน-Jแต่อาจยังใหม่พอที่จะรองรับProxyJumpตัวเลือก ลองใช้หนึ่งในคำตอบอื่น ๆ ที่ใช้ตัวเลือกนี้อย่างชัดเจน
Gordon Davisson

2
นี่ควรเป็นคำตอบที่ยอมรับได้ ฉันดูถูกคำตอบทั้งหมดสำหรับsshคำถามที่แนะนำให้คุณปรับเปลี่ยนconfigสำหรับโฮสต์ที่เฉพาะเจาะจงเมื่อตัวเลือกบรรทัดคำสั่งง่าย ๆ เพียงพอที่จะทำงานได้
Clemisch

2
"Despise" ดูเหมือนจะเป็นปฏิกิริยาที่รุนแรง แน่นอนว่ามีหลายกรณีที่การแก้ไขอย่างรวดเร็วของบรรทัดคำสั่งนั้นง่ายกว่าการแก้ไขไฟล์การตั้งค่าครั้งแรก แต่ถ้าคุณกำลังวางแผนที่จะเชื่อมต่อไปยังโฮสต์เดียวกันหลายครั้งผมจะแน่นอนค่อนข้างปรับปรุงแฟ้มการกำหนดค่าของฉันเมื่อกว่าการใช้-J user@intermediateทุกครั้งที่ผมจำเป็นต้องเชื่อมต่อ
chepner

10

บางครั้งเราสามารถใช้ท่อ เวลานั้นคือวันนี้

ssh -A user@host1 ssh user@host2 cat filename > filename

คุณสามารถอัพโหลดได้เช่นกัน

ssh -A user@host1 ssh user@host2 cat \\\> filename < filename

ใช่มีวิธีแก้ไขปัญหาอื่น ๆ ที่เกี่ยวข้องกับพร็อกซี่และอื่น ๆ แต่การรู้วิธีการทำเช่นนี้มีประโยชน์


การใช้งานที่มีประโยชน์ของcat!
Piskvor

หมายเหตุสิ่งนี้ให้ผู้ใช้ที่มีสิทธิพิเศษอย่างเพียงพอสำหรับการเข้าถึงโฮสต์ระดับกลางไปยังเอเจนต์ ssh และคีย์ของคุณ ข้อมูลที่ไหลระหว่างโฮสต์และโฮสต์ 2 ของคุณจะไม่มีการเข้ารหัสบนโฮสต์ 1 วิธีการใช้พรอกซีและการกระโดดข้ามหลีกเลี่ยงปัญหาทั้งสองนี้
James

@ เจมส์: ฉันไม่รู้ตัว โฮสต์ Bastion เช่นนี้มักเชื่อถือได้มาก
โจชัว

7

ใช้การProxyJumpกำหนดค่า:

ProxyJump
ระบุผู้รับมอบฉันทะอย่างน้อยหนึ่งคนเป็น [user @] host [: port] หรือ ssh URI พร็อกซีหลายรายการอาจคั่นด้วยอักขระจุลภาคและจะเข้าชมตามลำดับ การตั้งค่าตัวเลือกนี้จะทำให้ ssh (1) เชื่อมต่อกับโฮสต์เป้าหมายก่อนทำการเชื่อมต่อ ssh (1) ไปยังโฮสต์ ProxyJump ที่ระบุจากนั้นสร้างการส่งต่อ TCP ไปยังเป้าหมายสุดท้ายจากที่นั่น

scp -o ProxyJump=user@intermediate user@target:/path

2

มีโปรโตคอลโบราณที่เรียกว่าZMODEM : มีโปรแกรมไม่กี่โปรแกรมที่ให้การสนับสนุนในทุกวันนี้ แต่เมื่อมันใช้งานได้

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

ในเครื่องที่ทำงานให้เรียกใช้: sudo apt install lrzsz

ตอนนี้สิ่งที่คุณต้องทำคือการ SSH sz (filename)ไปยังเครื่องที่ทำงานของคุณและเรียกใช้ ไฟล์จะถูกดาวน์โหลดผ่านเทอร์มินัลของคุณ


1

การกำหนดค่าภายใต้ ssh ของผู้ใช้: ~/.ssh/config

Host *
    UserKnownHostsFile=/dev/null
    StrictHostKeyChecking=no
    ServerAliveInterval 300
    ServerAliveCountMax 2
    ForwardAgent yes


Host jump server
    HostName server.company.org
    User root

Host jump1 server1
    HostName server1.dmz.company.org
    User root
    ProxyJump jump

Host jump2 server2
    HostName server.dmz2.company.org
    User root
    ProxyJump jump1

Host *.intranet.company.org
    User user
    ProxyJump jump2

คุณสามารถคัดลอกตอนนี้จากเซิร์ฟเวอร์อินทราเน็ตโดยตรงผ่านเซิร์ฟเวอร์ข้าม3เครื่อง

scp user@server.intranet.company:/home/user/ ./*

ฉัน preffer นี้เพราะไม่จำเป็นต้องระบุข้ามเซิร์ฟเวอร์ด้วย scp


0

ผ่าน SCP -3:

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

2
-3ตัวเลือกอธิบายว่า "สำเนาระหว่างสองครอบครัวระยะไกลจะถูกโอนผ่านโฮสต์ท้องถิ่น." ในขณะที่ฉันเชื่อว่าคำถามนี้กำหนดว่าโฮสต์ท้องถิ่นไม่สามารถเข้าถึง "remote2"
Jeff Schaller

2
@JeffSchaller: คุณเชื่อมต่อกับเครื่องในกลางแล้ว-3ใช้ แต่นี่ถือว่าคุณสามารถเชื่อมต่อจากเครื่องตรงกลางกลับไปเป็นเครื่องแรกได้
โจ

ฉันไม่เห็นประโยชน์ใด ๆ มากกว่านี้/-J JumpHostค่อนข้างตรงกันข้ามเนื่องจากมีข้อ จำกัด ที่ @Joe กล่าวถึง
Martin Prikryl
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.