ssh config中有多个类似的条目


193

假设我要ssh使用.ssh config文件中的相同设置为30台服务器配置选项:

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

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

Answers:


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功能出现在OpenSSH的5.6版中。我想知道为什么以前没看过-Debian Squeeze中的版本是5.5。
jw013 2013年

2
如果您使用的是旧版操作系统或需要不受其支持的规则,则config始终可以编写一个简单的脚本来生成您的config
罗杰·达尔2015年

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(以及我自己)有实际帮助的唯一答案。
疯狂物理学家,2013年

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

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

可以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"

谢谢!这似乎是我所需要的,但是我仍然不知道如何使它适应我的情况。?我想在问号所替换的图案处 使用问号*吗?
2013年

2
嗯 我认为模式有别于我需要的目的。它们将多个查询重定向到同一config条目,但是主机的参数是固定的(即,不能使用模式来对参数进行模板化)。我错了吗?
Amelio Vazquez-Reina

4
@ user27915816是的,您是对的,据我所知没有办法做“模板”。您能做的最好的事情就是将常数行分成一个单独的Host *条目,并为每个常数条目有一个单独的条目,Host XXX该条目仅包含变化的部分(即Hostname XXX.YYY.ZZZ直线)。
jw013 2013年

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

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

8

这对我有用:

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

主持人* .xxx.auckland.ac.nz
   用户myuser
主持人* .yyy.auckland.ac.nz
   用户myuser

这样一来,用户就可以使用域中的名称并更改用户名:

bluebottle:〜user_one $ ssh itslogprd05
myuser@itslogprd05.xxx.auckland.ac.nz的密码: 

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

如果itslogprd05两个域中都存在主机怎么办?xxx.auckland.ac.nz胜,我猜呢?
Levente Huszko
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.