假设我想为30台服务器配置ssh选项,并在.ssh文件中设置相同的设置:

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台机器之间唯一改变的是config

除了在我的XXX文件中重复上述结构30次之外,还有另一种方法来定义一系列机器吗?

#1 楼

来自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


评论


似乎%h功能出现在OpenSSH 5.6版本中。我想知道为什么以前没看过-Debian Squeeze中的版本是5.5。

– jw013
13年1月17日在20:09

如果您使用的是旧版操作系统或需要配置不支持的规则,则始终可以编写一个简单的脚本来生成配置。

–罗杰·达尔(Roger Dahl)
15年11月6日在1:01

#2 楼

为了最小化设置,您可以使用一个这样的.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 *

评论


这似乎是对OP(和我自己)有实际帮助的唯一答案。

–疯狂物理学家
16-09-27在19:59

优先顺序是什么?只是文件稍后定义的内容会覆盖文件先前定义的内容吗?就像说我在“主机X01”下具有“压缩否”,然后被“主机X01 X02”下的“压缩是”覆盖吗?

–本·农夫
18-2-7在13:39

从ssh_config手册开始:由于使用了每个参数的第一个获得的值,因此应在文件开头附近给出更多特定于主机的声明,并在结尾处给出常规默认值。

–纪尧姆·文森特(Guillaume Vincent)
18年2月7日在18:34

主机X01 X02 ...可以被* .YYY.com取代吗?如果可行,这似乎更易于管理。

–迈克尔
19-09-19在20:46

我将此答案与使用%h的答案结合在一起,它的作用很吸引人(因为只有太长的主机名,我只有一个需要使用别名的主机名。

–mic
20年5月6日在16:47

#3 楼

只需使用*

请参阅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)
2013年1月17日18:59



嗯我认为模式与我需要的目的不同。它们将多个查询重定向到同一个配置条目,但是主机的参数是固定的(即,模式不能用于参数模板)。我错了吗?

–阿梅里奥·巴斯克斯·雷纳(Amelio Vazquez-Reina)
2013年1月17日19:03



@ user27915816是的,您是对的,据我所知没有办法做“模板”。最好的办法是将常数行分隔为一个Host *条目,并为每个仅由不同部分组成的Host XXX提供单独的条目(即Hostname XXX.YYY.ZZZ行)。

– jw013
13年1月17日在19:47

谷歌搜索“ ssh config通配符”时,此页面是目前最高的结果,因此感谢您提供解决该问题的答案。

–vastlysuperiorman
18-09-10的19:00

#4 楼

从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,因此HostName应该仅是%h,而不是%h.YYY.com

– biocyberman
19年2月11日在9:15

@biocyberman XXX *仅当您键入ssh XXX2.YYY.com而不是ssh XXX2时,才表示XXX.YYY.com。

–周慧敏
20年1月22日在12:45

#5 楼

这对我有用:

CanonicalizeHostname yes
CanonicalDomains xxx.auckland.ac.nz yyy.auckland.ac.nz

host  *.xxx.auckland.ac.nz
   user myuser
host *.yyy.auckland.ac.nz
   user myuser


这允许一个人在域中使用名称并更改用户名:

bluebottle:~ user_one$ ssh itslogprd05
myuser@itslogprd05.xxx.auckland.ac.nz's password: 


评论


这是对我最好的答案。我摆脱了以前用来生成配置的脚本!

–玩笑
17年2月9日在19:50

如果两个域中都存在itslogprd05主机怎么办? xxx.auckland.ac.nz赢了,我猜呢?

–莱文特·赫兹科(Levente Huszko)
19 Mar 2 '19 at 17:54

#6 楼

以下方法有效。

Host 10.10.* 10.11.*
     User vagrant