ProxyCommand ใช้สำหรับการพิสูจน์ตัวตนหลายครั้งและพร้อมท์


18

ฉันจะเขียนคำสั่งต่อไปนี้อีกครั้งด้วยได้ProxyCommandอย่างไร?

ssh -l username1 -t jumphost1 \
ssh -l username2 -t jumphost2 \
ssh -l username3 -t jumphost3 \
ssh -l username4    server

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

ssh -o ProxyCommand="\
ssh -l username1 -t jumphost1  \
ssh -l username2 -t jumphost2  \
ssh -l username3 -t jumphost3" \
    -l username4    server

username1@jumphost1's password:
Pseudo-terminal will not be allocated because stdin is not a terminal.
Permission denied, please try again.
Permission denied, please try again.
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
ssh_exchange_identification: Connection closed by remote host

ฉันรู้ของการใช้งานที่มีncแต่ฉันมองหาวิธีที่จะใช้กับ 3+ scpฮ็อพและยังใช้ตัวเลือกนี้ด้วย ฉันตรวจสอบssh_configหน้าคน แต่ข้อมูลค่อนข้างหายากสำหรับฉันอย่างน้อย

แก้ไข

ฉันพยายามใช้ProxyCommandซ้อนกันProxyCommandตามที่แนะนำด้านล่าง แต่ฉันได้รับบางอย่างตามบรรทัดต่อไปนี้

debug3: ssh_init_stdio_forwarding: 192.17.2.2:2222
debug1: channel_connect_stdio_fwd 192.17.2.2:2222
debug1: channel 0: new [stdio-forward]
debug2: fd 4 setting O_NONBLOCK
debug2: fd 5 setting O_NONBLOCK
debug1: getpeername failed: Bad file descriptor
debug3: send packet: type 90
debug2: fd 3 setting TCP_NODELAY
debug3: ssh_packet_set_tos: set IP_TOS 0x10
debug1: Requesting no-more-sessions@openssh.com
debug3: send packet: type 80
debug1: Entering interactive session.

โชคดีที่ตั้งแต่7.3 -JหรือตอบProxyJumpสนองวัตถุประสงค์ของฉัน - แม้ว่าฉันจะต้องแก้ไขการตั้งค่าคีย์ของฉัน

ssh -q -J user1@jumphost1,user2@jumphost2,user3@jumphost3 user@server

คำตอบ:


26

ncรุ่นไม่แนะนำให้ใช้อีกต่อไป ใช้-Wสวิตช์ซึ่งมีให้ใน OpenSSH เวอร์ชันล่าสุด นอกจากนี้คุณไม่จำเป็นต้องคัดลอกการกำหนดค่าไปยังโฮสต์อื่น! การกำหนดค่าทั้งหมดต้องทำบนโฮสต์ของคุณและจะไม่รบกวนการทำงาน แต่อย่างscpใด เพียงสร้างไฟล์~/.ssh/configด้วย:

Host jumphost1
  User username1
Host jumphost2
  User username2
  ProxyCommand ssh -W %h:%p jumphost1
Host jumphost3
  User username3
  ProxyCommand ssh -W %h:%p jumphost2
Host server
  User username4
  ProxyCommand ssh -W %h:%p jumphost3

และจากนั้นเชื่อมต่อการใช้หรือการใช้งานssh server scp file server:path/หากคุณยืนยันใน oneliner (หรือไม่แน่ใจว่าคุณหมายถึงอะไรเกี่ยวกับการProxyCommandทำรัง) จากนั้นก็ชี้ให้เห็นว่ามันเป็นทางหนีนรก:

ssh -oProxyCommand= \
  'ssh -W %h:%p -oProxyCommand= \
    \'ssh -W %h:%p -oProxyCommand= \
      \\\'ssh -W %h:%p username1@jumphost1\\\' \
    username2@jumphost2\' \
  username3@jumphost3' \
username4@server

โดยทั่วไปคุณต้องไปจากภายใน


ขอบคุณ พยายามซับหนึ่งไม่ทำงาน ฉันไม่รู้ว่ามันเป็นแค่การหลบหนี กรุณาตรวจสอบอีกครั้งได้ไหม นอกจากนี้คุณสามารถอธิบายได้ว่าทำไมการทำรังจึงมีความจำเป็นและการผูกมัดไม่ทำงาน
1.61803

1
อะไร "ไม่ทำงาน!" หมายความว่าอย่างไร การผูกมัดทำงานได้ แต่ไม่ใช่ด้วยscpเพราะ SCP คาดว่าจะมีข้อความควบคุมของ SCP แต่ได้รับข้อความควบคุม SSH และล้มเหลวแทน ในทางตรงกันข้ามProxyCommandมันไม่โปร่งใสและดังนั้นนอกสุดssh(หรือscp) จะได้รับข้อความโดยตรงจากปลายอีกด้าน
Jakuje

ฉันได้รับ> พรอมต์ที่รอการแบ่งความต่อเนื่องของบรรทัดฉันเดา - นั่นคือคำสั่งไม่ดำเนินการ
1.61803

1
@TrevorBoydSmith เพราะต้องการให้คุณติดตั้งโปรแกรมภายนอก (nc) บนโฮสต์พร็อกซีทั้งหมด การเปลี่ยนเส้นทาง IO โดยใช้ -W ไม่จำเป็นต้องมีข้อกำหนดเพียงอย่างเดียวคือให้ไคลเอ็นต์ openssh ติดตั้งในคอมพิวเตอร์ของคุณ
Jakuje

2
@RomanDodin สองครั้ง%ควรทำงาน: %%hในกรณีของคุณ
Jakuje

-1

ฉันได้ทำสิ่งนี้ด้วยสองฮ็อพ แต่มันควรจะใช้ได้สำหรับสามคน วิธีที่ง่ายที่สุดคือการ~/.ssh/configตั้งค่าไฟล์ในแต่ละโฮสต์ ดังนั้นหากคุณต้องการที่จะอยู่hostaและได้รับhostdผ่านhostbและ hostc` คุณสามารถตั้งค่าการกำหนดค่าของคุณดังนั้น:

ในhosta:~/.ssh/config:

Host hostd
    User username
    ProxyCommand ssh hostb nc %h %p 2> /dev/null

ในhostb:~/.ssh/config:

Host hostd
    User username
    ProxyCommand ssh hostc nc %h %p 2> /dev/null

ในhostc:~/.ssh/config:

Host hostd
    User username
    ProxyCommand ssh hostd nc %h %p 2> /dev/null

จากนั้นคุณสามารถssh hostdที่ใด ๆ hostdของเจ้าภาพในห่วงโซ่และคุณจะทำวิธีของคุณ

ใช้ netcat scpสำหรับพร็อกซี่ไม่ยุ่งเกี่ยวกับ

หากด้วยเหตุผลบางอย่างที่คุณไม่ต้องการใช้~/.ssh/configไฟล์ในเครื่องคุณสามารถทำได้ที่hosta:

ssh -oProxyCommand='ssh -oProxyCommand=\'ssh -o ProxyCommand=\\\'ssh username@hostd nc %h %p 2>/dev/null\\\' username@hostc nc %h %p 2> /dev/null' username@hostb nc %h %p 2> /dev/null' username@hostd

อย่างที่ฉันพูดฉันรู้ตัวncว่าใช้ คุณสามารถเขียนคำสั่งที่ฉันโพสต์ด้วยProxyCommandเป็นตัวเลือกได้จริงหรือไม่?
1.61803

คุณพูดถึง "คุณทราบถึงการใช้งาน แต่ต้องการใช้scp" scpมันไม่ได้ยุ่งเกี่ยวกับ แต่ฉันจะให้คำสั่งที่ยาวและตลกแก่คุณเพื่อแก้ไขในไม่ช้า
DopeGhoti

ขอบคุณ คุณช่วยเขียนคำตอบของคุณโดยเน้นไปที่การProxyCommandสร้างรังได้ไหม? หากคุณอ่านโพสต์ของฉันอีกครั้งคุณจะเห็นว่าเป็นส่วนสำคัญ ProxyCommandฉันคิดว่าฉันจะทำได้แทนการทำรังเช่นคุณได้โซ่ทุกโหนดกลาง ฉันยังสงสัยว่าเป็นไปได้อย่างใด
1.61803

นั่นคือความจริงสิ่งที่กำลังทำ; มันเป็นเรื่องยากมากที่จะอ่านมากกว่าในการกำหนดค่าแหล่งกำเนิดเพราะคำพูดที่ซ้อนกัน (และหลบหนีมากขึ้น) คุณต้องทำอย่างนั้นเพราะคุณกำลังนำProxyCommandแนวทางทั้งหมดพร้อมกับคุณไปยังโฮสต์ต่อไปในห่วงโซ่
DopeGhoti

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