. ssh / config Host สามารถมีหลายชื่อโฮสต์ได้หรือไม่?


10

ฉันได้ตั้งค่าการส่งต่อ ssh และเราเตอร์พอร์ตดังนั้นฉันจึงสามารถ ssh ลงในคอมพิวเตอร์บนเครือข่ายภายในบ้านของฉันเมื่อฉันไม่ได้อยู่บ้าน ปัจจุบันฉันมีสองรายการใน.ssh/configไฟล์ของฉันรายการหนึ่งสำหรับเมื่อฉันอยู่ในเครือข่ายในบ้านของฉันและอีกรายการหนึ่งสำหรับเมื่อฉันไม่ได้:

Host mycomputer
  HostName 192.168.X.X

Host mycomputerathome
  HostName my.no-ip.dynamic

ใช้งานได้ แต่ฉันสงสัยว่าฉันจะทำให้ตัวเองง่ายขึ้นได้ไหม ฉันหวังว่าจะมีวิธีในการแสดงรายการ HostName หลายรายการเช่นถ้ารายการแรกล้มเหลวจะกลับไปเป็นรายการที่สอง:

Host mycomputer
  HostName 192.168.X.X
  HostName my.no-ip.dynamic

เพื่อที่จะพยายามเชื่อมต่อกับโฮสต์บนเครือข่ายท้องถิ่นของฉันก่อนและหากยังไม่มีอยู่มันจะพยายามเชื่อมต่อโดยใช้ชื่อโฮสต์แบบไดนามิก no-ip ของฉัน ฉันได้ลองป้อนชื่อโฮสต์สองรายการ แต่การรันssh mycomputerบล็อกเพียงแค่ไม่ทำอะไรเลย

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

เป็นไปได้ไหมที่จะระบุชื่อโฮสต์สำรองเพื่อลองใช้หากชื่อแรกไม่ทำงาน


unix.stackexchange.com/questions/424755/..คล้ายกันและอาจจะสามารถปรับใช้สำหรับชื่อโฮสต์แทนพอร์ต
thrig

BTW .ssh/configสามารถเรียกใช้สคริปต์สำหรับคุณสมบัติบางอย่าง ฉันรู้ว่าคุณสามารถทำได้ด้วย ProxyCommand คุณสามารถทำบางสิ่งบางอย่างที่แสดงใน Q & A นี้จากเอสเอฟ - serverfault.com/questions/401233/...
slm

คำตอบ:


8

มันน่าเกลียด แต่ฉันคิดว่าคุณสามารถทำได้โดยใช้execเกณฑ์Matchในสถานะทางออกของการเคาะพอร์ตเช่น

Host mycomputer
  Match exec "nc -z 192.168.1.11 %p"
    HostName 192.168.1.11
  Match !exec "nc -z 192.168.1.11 %p"
    HostName my.no-ip.dynamic

โปรดทราบว่าสิ่งนี้ไม่สามารถบอกได้อย่างชัดเจนว่าคุณอยู่ในเครือข่ายภายในบ้าน "ของคุณ" เพียงแค่คุณอยู่ในเซกเมนต์ LAN ส่วนตัวด้วยช่วงที่อยู่เดียวกันที่เกิดขึ้นเพื่อให้บริการฟังที่อยู่ / พอร์ตเดียวกัน


1
ฉันต้องเพิ่ม-w 1หรือncดูเหมือนว่าจะรอตลอดไป สิ่งที่ง่ายกว่าคือการจับคู่ครั้งที่สองสามารถทำได้Match exec "true"เพราะหากการจับคู่ครั้งแรกล้มเหลวเพียงลองเลือกตัวเลือกที่สอง
Corey Ogburn

@CoreyOgburn ah ใช่ฉันพยายามคิดวิธีที่ดีกว่าในการทำเงื่อนไขอื่น (สงสารMatchไม่มีElse)
steeldriver

ดังนั้นฉันจึงพบปัญหาเกี่ยวกับวิธีการนี้ ฉันยังเรียกใช้เว็บไซต์พูด xyz.com และเมื่อฉันพยายามที่จะssh xyz.comฉันMatch exec "true"จับที่และเปลี่ยนเส้นทางให้ฉันเป็นเซิร์ฟเวอร์ที่บ้านของฉันโดยใช้ชื่อโฮสต์ระยะไกลของฉัน ฉันจะลองใช้ผู้บริหารของคุณ แต่ฉันคิดว่าสิ่งเดียวกันจะเกิดขึ้น
Corey Ogburn

ใช่การใช้ของคุณMatch exec... Match !execทำให้ ssh'ing ไปยังโดเมนอื่นเพื่อทริกเกอร์Match !execและเขียนชื่อโฮสต์ใหม่
Corey Ogburn

2
ดังนั้นปรากฎว่า~/.ssh/configไม่สนใจการเยื้องน้อยลง คำสั่งบางคำสั่งรีเซ็ตขอบเขตนั่นคือแต่ละบรรทัดของโฮสต์ใหม่บอกว่า "บรรทัดก่อนหน้านี้ใช้สำหรับโฮสต์ก่อนหน้าบรรทัดต่อไปนี้ใช้สำหรับโฮสต์ใหม่นี้" ปรากฎว่าMatchมีอำนาจ "ขอบเขตการรีเซ็ต" เช่นเดียวกับโฮสต์ ในการพิจารณาเรื่องนี้ฉันได้แทนที่บรรทัดโฮสต์ด้วยMatch Host mycomputer exec "nc -w 1 -z 192.168.X.X 22"และกำหนดค่าที่กำหนดเองทั้งหมดสำหรับเครือข่ายท้องถิ่น ฉันเพิ่มบรรทัดที่ตรงกันยกเว้น!execแล้วเพิ่มค่าทั้งหมดเมื่อฉันอยู่นอกเครือข่าย ตอนนี้มันใช้ได้ดีสำหรับโฮสต์ทั้งหมด
Corey Ogburn

2

ฉันใช้สิ่งนี้

Match host mycomputer exec "nc -G 1 -z 192.168.1.11 %p"
    HostName 192.168.1.11
Match host mycomputer # fallback
    HostName my.no-ip.dynamic
Host mycomputer
    # ... other configs

Host not-my-computer
# ... other configs

ssh_config ไม่มีบล็อกที่เยื้อง หากคุณต้องการ จำกัด การจับคู่ประโยคให้เฉพาะโฮสต์คุณควรอธิบายเงื่อนไขทั้งหมด

คุณสามารถหลีกเลี่ยงการรอนานncโดยให้-G 1ตัวเลือก (การเชื่อมต่อหมดเวลา 1 วินาที) และคุณสามารถใช้พฤติกรรมดังต่อไปนี้เพื่อหลีกเลี่ยงการเรียกใช้หลาย ๆnc

การแข่งขัน
แนะนำบล็อกที่มีเงื่อนไข หากตรงตามเกณฑ์ทั้งหมดในบรรทัดการจับคู่คำหลักในบรรทัดต่อไปนี้จะแทนที่ชุดที่อยู่ในส่วนส่วนกลางของไฟล์กำหนดค่าจนกว่าจะตรงกับบรรทัดอื่นหรือสิ้นสุดไฟล์ หากคำหลักปรากฏในบล็อกการแข่งขันหลายรายการที่พอใจจะมีการใช้งานอินสแตนซ์แรกของคำหลักเท่านั้น

https://www.freebsd.org/cgi/man.cgi?sshd_config(5)


1

ไม่มี หากคุณระบุหลายรายการHostNameสำหรับหนึ่งHostรายการเฉพาะรายการแรกเท่านั้นที่จะได้รับการยอมรับ:

$ grep -A5 Host .ssh/config
Host test
   HostName fake.tld.xyzzy
   HostName real.example.com
   HostName 127.1.2.3
   User username
$ ssh test
ssh: Could not resolve hostname fake.tld.xyzzy: Name or service not known

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