รายการที่คล้ายกันหลายรายการใน ssh config


193

กล่าวว่าฉันต้องการกำหนดค่าsshตัวเลือกของฉันสำหรับเซิร์ฟเวอร์ 30 ตัวด้วยการตั้งค่าเดียวกันใน.ssh configไฟล์

host XXX
     HostName XXX.YYY.com
     User my_username
     Compression yes
     Ciphers arcfour,blowfish-cbc
     Protocol 2
     ControlMaster auto
     ControlPath ~/.ssh/%r@%h:%p
     IdentityFile ~/.ssh/YYY/id_rsa

ที่มีเพียงสิ่งเดียวที่มีการเปลี่ยนแปลงระหว่างทั้ง 30 XXXเครื่องเป็น

แทนที่จะทำซ้ำโครงสร้างข้างต้น 30 ครั้งในconfigไฟล์ของฉันมีวิธีอื่นในการกำหนดช่วงของเครื่องหรือไม่?

คำตอบ:


232

จากssh_config(5)หน้าคน:

 Host    Restricts the following declarations (up to the next Host key‐
         word) to be only for those hosts that match one of the patterns
         given after the keyword.  If more than one pattern is provided,
         they should be separated by whitespace.

...

 HostName
         Specifies the real host name to log into.  This can be used to
         specify nicknames or abbreviations for hosts.  If the hostname
         contains the character sequence ‘%h’, then this will be replaced
         with the host name specified on the commandline (this is useful
         for manipulating unqualified names).

ดังนั้น:

Host XXX1 XXX2 XXX3
  HostName %h.YYY.com

9
มันปรากฏ%hคุณลักษณะที่ปรากฏในการเปิดตัว 5.6 ของ OpenSSH ฉันสงสัยว่าทำไมฉันไม่เคยเห็นมาก่อน - เวอร์ชันใน Debian Squeeze คือ 5.5
jw013

2
หากคุณใช้ระบบปฏิบัติการเก่าหรือต้องการกฎที่ไม่ได้รับการสนับสนุนconfigคุณสามารถเขียนสคริปต์ง่ายๆที่สร้างขึ้นconfigได้
Roger Dahl

69

เพื่อลดการตั้งค่าคุณสามารถมี.ssh/configเช่นนี้

Host X01
    HostName X01.YYY.com

Host X02
    HostName X02.YYY.com

...

Host X01 X02 ...
     User my_username
     Compression yes
     Ciphers arcfour,blowfish-cbc
     Protocol 2
     ControlMaster auto
     ControlPath ~/.ssh/%r@%h:%p
     IdentityFile ~/.ssh/YYY/id_rsa

Host X01 X02 ...อาจถูกแทนที่ด้วยHost *ถ้าทุกโฮสต์มีการกำหนดค่าต่อไปนี้


2
นี่เป็นคำตอบเดียวที่ช่วย OP (และตัวฉันเอง)
นักฟิสิกส์บ้า

ลำดับความสำคัญคืออะไร มันเป็นเพียงสิ่งที่กำหนดไว้ในภายหลังในไฟล์แทนที่สิ่งที่กำหนดไว้ก่อนหน้าในไฟล์หรือไม่ เช่นว่าฉันมี "การบีบอัด no" ภายใต้ "Host X01" นั้นจะถูกแทนที่โดย "การบีบอัดใช่" ภายใต้ "Host X01 X02" หรือไม่
ชาวนาเบ็น

1
จากคู่มือ ssh_config: เนื่องจากมีการใช้ค่าที่ได้รับครั้งแรกสำหรับแต่ละพารามิเตอร์จึงควรมีการประกาศเฉพาะโฮสต์เพิ่มเติมใกล้จุดเริ่มต้นของไฟล์และค่าเริ่มต้นทั่วไปในตอนท้าย
Guillaume Vincent

สามารถHost X01 X02 ...ถูกแทนที่ด้วย*.YYY.com? ดูเหมือนว่าจัดการได้ง่ายกว่าเล็กน้อยหากใช้งานได้
ไมเคิล

51

เพียงใช้ *

ดูman ssh_config:

รูปแบบรูปแบบประกอบด้วยอักขระที่ไม่ใช่ช่องว่างอย่างน้อยศูนย์อักขระ '*' (สัญลักษณ์ตัวแทนที่ตรงกับอักขระศูนย์หรือมากกว่า) หรือ '?' (อักขระตัวแทนที่ตรงกับตัวละครตัวเดียว) ตัวอย่างเช่นในการระบุชุดการประกาศสำหรับโฮสต์ใด ๆ ในชุด ".co.uk" ของโดเมนสามารถใช้รูปแบบต่อไปนี้:

       Host *.co.uk

 The following pattern would match any host in the 192.168.0.[0-9] network range:

       Host 192.168.0.?

 A pattern-list is a comma-separated list of patterns.  Patterns within pattern-lists may be negated by preceding them with an
 exclamation mark (‘!’).  For example, to allow a key to be used from anywhere within an organisation except from the “dialup”
 pool, the following entry (in authorized_keys) could be used:

       from="!*.dialup.example.com,*.example.com"

ขอบคุณ! ดูเหมือนว่าจะเป็นสิ่งที่ฉันต้องการ แต่ฉันก็ยังไม่เข้าใจวิธีปรับให้เข้ากับกรณีของฉัน ฉันจะใช้เครื่องหมายคำถาม?ทุกที่ที่ต้องการให้แทนที่ด้วยรูปแบบที่ตรงกับ *เครื่องหมายหรือไม่
Amelio Vazquez-Reina

2
อืมมม ฉันคิดว่ารูปแบบมีจุดประสงค์ที่แตกต่างจากสิ่งที่ฉันต้องการ พวกเขาเปลี่ยนเส้นทางแบบสอบถามหลายรายการไปยังconfigรายการเดียวกันแต่พารามิเตอร์ของโฮสต์ได้รับการแก้ไข (เช่นรูปแบบไม่สามารถใช้ในการแม่แบบพารามิเตอร์) ฉันผิดหรือเปล่า?
Amelio Vazquez-Reina

4
@ user27915816 ใช่คุณพูดถูกไม่มีวิธีทำ "เทมเพลต" เท่าที่ฉันรู้ สิ่งที่ดีที่สุดที่คุณสามารถทำได้คือแยกบรรทัดค่าคงที่ออกเป็นHost *รายการเดียวและมีรายการแยกต่างหากสำหรับแต่ละรายการHost XXXที่ประกอบด้วยเฉพาะส่วนที่แตกต่างกัน (เช่นHostname XXX.YYY.ZZZบรรทัด)
jw013

หน้านี้เป็นผลลัพธ์อันดับต้น ๆ (ตอนนี้) เมื่อ Googling "ssh config wildcard" ดังนั้นขอขอบคุณที่ให้คำตอบสำหรับคำถามนั้น
vastlysuperiorman

9

จากคำตอบของ Ignacio Vazquez-Abrams และ H. -Dirk Schmitt เราสามารถเพิ่มคำสั่งต่อไปนี้ใน. ssh / config

HOST XXX*
    HostName %h.YYY.com
    User myname

จากนั้นเช่นคุณสามารถเข้าสู่ระบบในชื่อ myname@XXX2.YYY.com โดย

ssh XXX2

เนื่องจาก XXX * แสดงถึง XXX.YYY.com แล้วชื่อโฮสต์ควรเป็นเท่านั้น%hไม่ใช่%h.YYY.com
biocyberman

8

สิ่งนี้ใช้ได้กับฉัน:

CanonicalizeHostname ใช่
CanonicalDomains xxx.auckland.ac.nz yyy.auckland.ac.nz

host * .xxx.auckland.ac.nz
   ผู้ใช้ myuser
host * .yyy.auckland.ac.nz
   ผู้ใช้ myuser

สิ่งนี้อนุญาตให้ใช้ชื่อภายในโดเมนและเปลี่ยนชื่อผู้ใช้:

bluebottle: ~ user_one $ ssh itslogprd05
รหัสผ่านของ myuser@itslogprd05.xxx.auckland.ac.nz: 

นี่คือคำตอบที่ดีที่สุดสำหรับฉัน ฉันกำจัดสคริปต์ที่ฉันใช้เพื่อสร้าง config ของฉัน!
jooks

เกิดอะไรขึ้นถ้าitslogprd05โฮสต์มีอยู่ในทั้งสองโดเมน xxx.auckland.ac.nzชนะฉันเดา
Levente Huszko
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.