สร้างรายการโฮสต์ SSH แบบไดนามิกใน ~ / .ssh / config


9

ฉันต้องจัดการกองทั้งหมดของโฮสต์มากกว่า ssh อย่างไรก็ตามฉันสามารถเข้าถึงได้ผ่านเซิร์ฟเวอร์ ssh ที่แน่นอนเท่านั้น

ฉันมีดังต่อไปนี้ในของฉัน~/.ssh/config:

Host mygateway-www
Hostname www
IdentityFile ~/.ssh/id_rsa
ProxyCommand ssh mygateway nc %h 22

อย่างไรก็ตามฉันต้องเชื่อมต่อกับเครื่องเหล่านี้มากมาย แทนที่จะใส่หลายรายการในของฉัน~/.ssh/configมีอยู่แล้วฉันสามารถมีอะไรเช่นนี้:

Host mygateway-*
Hostname ???WHAT GOES HERE????
IdentityFile ~/.ssh/id_rsa
ProxyCommand ssh mygateway nc %h 22

ฉันรู้ว่าคุณสามารถใช้%hในการHostnameโต้แย้ง แต่นั่นจะเป็นชื่อโฮสต์ ${VAR%thingie}สิ่งที่ผมจำเป็นต้องเป็นประเภทของสตริงทดแทนบางอย่างเช่นทุบตี เป็นไปได้ไหม

คำตอบ:


24

สามารถทำได้ด้วยไฟล์กำหนดค่า SSH ต่อไปนี้:

Host *
  ServerAliveInterval 120

Host gateway.somewhere.com
  User jdoe

Host gateway+*
  User jdoe
  ProxyCommand ssh -T -a $(echo %h |cut -d+ -f1).somewhere.com nc $(echo %h |cut -d+ -f2) %p 2>/dev/null
  ControlMaster auto
  ControlPath ~/.ssh/ssh-control_%r@%h:%p

จากนั้นคุณเข้าถึงโฮสต์ภายในของคุณเช่น:

ssh gateway+internalhost01.somewhere.com
ssh gateway+internalhost02.somewhere.com

ชื่อที่คุณเลือกสำหรับครึ่งที่ถูกต้องควรได้รับการแก้ไขโดย jump host

มีการระบุพารามิเตอร์ผู้ใช้ในกรณีที่คุณต้องการแมปไปยังผู้ใช้ที่แตกต่างกันด้วยตนเองในคลาสของโฮสต์ที่แตกต่างกัน มีการระบุ ControlMaster และ ControlPath เพื่ออนุญาตให้ใช้การเชื่อมต่อ SSH อีกครั้ง


6

คุณไม่จำเป็นต้องระบุชื่อโฮสต์ด้วยตนเองเพราะจะมาจากบรรทัดคำสั่ง

เพียงลอง:

Host *.domain  
  IdentityFile ~/.ssh/id_rsa  
  ProxyCommand ssh mygateway /usr/bin/nc %h 22

ปัญหาเกี่ยวกับวิธีการนั้นคือชื่อโฮสต์ค่อนข้างทั่วไป (เช่น db1, www, mail2) ในขณะที่ฉันต้องการให้พวกเขานำหน้าด้วยโครงการเช่นกันเนื่องจากฉันอาจต้อง ssh ไปยังเครื่องอื่นที่เรียกว่า 'db2' ดังนั้นคำนำหน้าใน Host
Rory

2
ดังนั้นคุณต้องการกำหนดค่า DNS ของคุณใหม่ วิธีที่ง่ายที่สุด (แต่วิธีที่ยุ่งยากที่สุด) คือการแก้ไขไฟล์โฮสต์ของคุณ คุณสามารถเพิ่มเซิร์ฟเวอร์ DNS ในเครื่องให้กับเวิร์กสเตชันของคุณด้วยโดเมน. invalid และใช้ชื่อโฮสต์ที่คุณต้องการ
Martin M.

+1 ก่อนหน้านี้ สร้างโดเมนย่อยสำหรับแต่ละโครงการ DNS จะมีที่จะทำให้ชีวิตของคุณง่ายขึ้น;)
แดน Carley


1

ฉันมีปัญหาที่คล้ายกันและจบลงด้วยการเขียนสคริปต์ที่สร้างแผ่นความร้อนทั้งหมดสำหรับฉัน ฉันไม่เปลี่ยน ~ / ssh / config อีกต่อไปฉันเปลี่ยน ~ / ssh / config.in และรันสคริปต์อีกครั้ง


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

ความคิดของฉันคือการมีไฟล์สำหรับแต่ละแม่แบบซึ่งแต่ละแม่แบบจะสร้างหนึ่งหรือมากกว่าหนึ่งรายการในรอบสุดท้าย.ssh/config.d ~/.ssh/configก็จะมีไฟล์ที่มีตัวแปรสากล แต่แต่ละเทมเพลตสามารถมีตัวแปรของตัวเองซึ่งจะมีความสำคัญเหนือกว่า globals ที่อยู่ด้านบน ~/.ssh/configไฟล์สามารถสร้างตามความต้องการหรือตามกำหนดเวลาที่มันจะไม่ได้เรื่องตราบใดที่คุณไม่เคยทำแก้ไขโดยตรงไปว่าคุณต้องการที่จะรักษา
iconoclast

สคริปต์ของฉันไม่มีเอกสารทั้งหมดและฉันไม่คิดว่ามันจะเข้าใจได้หากไม่มีเอกสารหรือตัวอย่างซึ่งฉันไม่มีเวลาสร้าง
Michael Hoffman

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

1
ฉันคิดว่ามันเป็นวิธีการที่ดีอาจจะสับสนน้อยกว่าวิธีที่ฉันใช้ ฉันอ่านการประกาศของโฮสต์จำนวนหนึ่งในหน่วยความจำจากนั้นจึงประกาศที่ไม่ได้เป็นโฮสต์ การประกาศที่ไม่ใช่โฮสต์จะใช้กับแต่ละโฮสต์ในกลุ่มปัจจุบันจนกว่าจะมีโฮสต์อื่น ฉันยังอนุญาตให้มีการประกาศโฮสต์หลายครั้งในไฟล์รวมถึงการใช้ globbing ในตอนท้ายฉันเขียนสิ่งที่ฉันสร้างขึ้นในความทรงจำทั้งหมด
Michael Hoffman

1

ละเว้นการระบุการแทนที่ชื่อโฮสต์โดยตรงผ่านการHostnameประกาศและพิจารณาว่ารันไทม์แทน ทำสิ่งนี้โดยการประเมินว่าเป็นส่วนหนึ่งของการProxyCommandใช้%hเพื่ออ้างอิงในคำสั่ง (ใช้%pแทนพอร์ต hardcoding ที่ 22) เช่น

Host mygateway-*
   #Hostname ???WHAT GOES HERE????
   IdentityFile ~/.ssh/id_rsa
   ProxyCommand ssh mygateway nc $(echo %h|sed 's/^mygateway-//') %p

เราสามารถมี stanza แบบทั่วไปได้มากขึ้นโดยคุณสามารถระบุโฮสต์ใด ๆ โดยไม่ต้อง-ให้ถือว่าเป็นอย่างนั้นหรือตาม stanza อื่นที่ตรงกัน แต่มี-วิธีทั่วไปเพื่อระบุใด ๆ<gateway>-<target>:

Host *-*
   # Assume LHS of "-" is GW and RHS of "-" is target host
   IdentityFile ~/.ssh/id_rsa
   ProxyCommand ssh $(echo %h|cut -d - -f1) nc $(echo %h|cut -d - -f2-) %p

นอกจากนี้เวอร์ชันใหม่กว่าของไคลเอ็นต์ SSH ยังสนับสนุน[-W host:port]ตัวเลือกในการทำหน้าที่เดียวกับnc(netcat) โดยตรง เช่นนี้เราสามารถใช้การแก้ไข:

Host *-*
   # Assume LHS of "-" is GW and RHS of "-" is target host
   IdentityFile ~/.ssh/id_rsa
   ProxyCommand ssh -W $(echo %h|cut -d - -f2-):%p $(echo %h|cut -d - -f1)

แน่นอนถ้าคุณมีรายชื่อโฮสต์ที่ จำกัด คุณสามารถทำได้เสมอ:

Host host1 host2 host3 hostN
   IdentityFile ~/.ssh/id_rsa
   ProxyCommand ssh mygateway nc %h %p

หวังว่านี่จะช่วยได้!


0

ฉันมีลูกค้าที่มีการตั้งค่าเดียวกันและฉันใช้DSSHเพื่อแก้ปัญหาของฉัน
DSSH เหนือสิ่งอื่นใดช่วยให้คุณสามารถล็อกอินเข้าสู่โฮสต์ระยะไกลอย่างโปร่งใสผ่านเกตเวย์โฮสต์

ใช้กรณี

  • รวบรวมพารามิเตอร์การกำหนดค่าจากเราเตอร์ของซิสโก้ที่ต้องการการเข้าสู่ระบบ "ena"
  • เข้าสู่ระบบเซิร์ฟเวอร์ที่มี PermitRootLogin ปิดการใช้งานโดยตรงในฐานะ root (โดยพิมพ์ su - และรหัสผ่านโดยอัตโนมัติ) ขณะที่ยังคงสถานะออก
  • เพิ่มตรรกะที่กำหนดเองเช่นการบันทึกขั้นสูง
  • อุโมงค์ผ่านการเชื่อมต่อต่าง ๆ เพื่อไปยังเซิร์ฟเวอร์เป้าหมาย

5
ฉันไม่ควรเริ่มใช้ ssh บุคคลที่สามแบบสุ่มที่ใช้ java สำหรับสิ่งที่ฉันสามารถทำได้ใน ~ / .ssh / config
Rory

ลิงค์นั้นตาย
iconoclast

แหล่งซอฟแวร์สามารถพบได้ใน Github: github.com/digmia/dssh
ผู้เยี่ยมชม
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.