ฉันจะ SCP ไฟล์ผ่านเซิร์ฟเวอร์ระดับกลางได้อย่างไร


15

ฉันใช้ Ccygwin บน WinXP (พร้อมกับ bash shell) ฉันต้องการ SCP ไฟล์จาก localhost ของฉันไปยังเครื่องระยะไกล - host2 อย่างไรก็ตามฉันสามารถ SSH ไปยังเครื่องระดับกลาง - host1 แล้วจากนั้น SSH ไปยัง host2 (หมายเหตุฉันไม่สามารถเข้าถึง host2 จาก localhost ของฉัน)

ฉันคิดว่าการขุดอุโมงค์เป็นคำตอบของฉัน แต่เมื่อฉันพยายามตั้งอุโมงค์

ssh -L 9999:localhost:9998 dalvarado@host1 'ssh -L 9998:localhost:1234 -N dalvarado@host2'

แต่หลังจากพิมพ์คำสั่งนี้แล้วกด Enter ระบบก็จะหยุดทำงาน อะไรคือวิธีที่เหมาะสมในการตั้งค่าอุโมงค์และจากนั้นไฟล์ SCP หลังจาก?

ขอบคุณ -


2
ทำซ้ำsuperuser.com/questions/174160/… - ดูคำตอบของฉันด้านล่างเพื่อรับข้อมูลสรุป
jmetz

จากผู้ใช้เมียร์ D : ยังเห็นserverfault.com/questions/337274/...
fixer1234

คำตอบ:


17

นี้ได้รับการตอบที่ดีที่สุดที่นี่

เพื่อสรุป: ใส่ต่อไปนี้ใน ~/.ssh/config

Host target.machine
User          targetuser
HostName      target.machine
ProxyCommand  ssh proxyuser@proxy.machine nc %h %p 2> /dev/null

แล้วเพียงแค่scpไปที่ target.machine เมื่อใดก็ตามที่คุณต้องการใช้งานผ่าน proxy.machine!

ใช้งานได้sshเช่นกันดังนั้นจะประหยัดเวลาของคุณในการกำหนดเป้าหมายไปยังเครื่องเป้าหมาย

เครดิตควรไปที่ผู้ใช้ 24925 คนที่ตอบคำถามนี้ในปี 2011


13

ในการตั้งค่าอุโมงค์ SSH ให้ใช้รูปแบบต่อไปนี้:

ssh -L 9999:host2:22 user@host1

คำสั่งนี้จะเชื่อมต่อกับhost1ฐานะuserและอุโมงค์พอร์ต 9999 บนคอมพิวเตอร์การออกคำสั่งไปยังพอร์ต host222 -Nเป็นตัวเลือกหรือคุณสามารถใช้บางสิ่งบางอย่างเช่นtopหรือwatchเพื่อให้เซสชั่นมีชีวิตถ้าจำเป็น

จากนั้นเพียงscpไปที่ host2 บน localhost: 9999


1
เมื่อฉันเรียกใช้คำสั่งนี้ฉันควรจะจบลงด้วยการเข้าสู่ host1? นอกจากนี้หลังจากเรียกใช้คำสั่งนี้ฉันเปิดเปลือก bash อีกอันและเรียกใช้ "scp hello.txt localhost: 9999" แต่ได้รับข้อผิดพลาด "ssh: เชื่อมต่อกับโฮสต์ localhost พอร์ต 22: การเชื่อมต่อถูกปฏิเสธ" ฉันทำอะไรผิดที่นี่
เดฟ

3
เมื่อคุณเรียกใช้คำสั่งนี้คุณจะเชื่อมต่อกับ host1 ใช่ scpไวยากรณ์คำสั่งของคุณไม่ถูกต้อง ลองใช้scp -P 9999 hello.txt user@localhost:/path/to/destination/fileที่ซึ่งuserเป็นผู้ใช้host2ที่คุณต้องการเข้าสู่ระบบเป็น
ฝนตก

1
@Rain, คุณสามารถใส่ตัวอย่างนี้ในคำตอบหลัก;)
dmeu

5

ตั้งแต่OpenSSH 7.3คุณสามารถใช้-Jหรือ-o ProxyJumpเพื่อระบุโฮสต์ bastion / jump ดังนั้นเพื่อ SSH node2ผ่านnode1:

ssh -J you@node1 you@node2

SCP ไม่มี-Jข้อโต้แย้ง แต่มันใช้ได้-oดังนั้นสิ่งนี้จึงใช้ได้

scp -o ProxyJump=you@node1 file.txt you@node2:~

3

คุณสามารถ scp ไฟล์แรกไปที่ host1 เช่นนี้:

scp file dalvarado@host1:.

จากนั้นทำสิ่งนี้เพื่อไปยังโฮสต์ 2:

ssh -t dalvarado@host1 'scp file dalvarado@host2:.'

-tตัวเลือกในการsshกองกำลังก็จะจัดสรรหลอกขั้วซึ่งอาจทำให้มันง่ายขึ้นสำหรับscpใน host1 เพื่อให้คุณวลีรหัสผ่าน / รหัสผ่าน หากคุณมี ssh-agent กำลังทำงานและกำหนดค่าทุกที่คุณไม่ควรได้รับแจ้งให้ใส่รหัสผ่าน / รหัสผ่าน

ฉันเสนอทางเลือกนี้เพราะถ้าคุณใช้ช่องสัญญาณคุณยังต้องมีสองคำสั่ง: คำสั่งหนึ่งตั้งค่าช่องสัญญาณและอีกคำสั่งหนึ่งเพื่อคัดลอกไฟล์ผ่านมัน ดูเหมือนง่ายกว่านี้


ทางออกที่ยอดเยี่ยม !!!
Riccardo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.