Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

Say I want to configure my ssh options for 30 servers with the same setup in my .ssh config file:

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

where the only thing that changes between these 30 machines is XXX.

Instead than repeating the above structure 30 times in my config file, is there another way to define a range of machines?

share|improve this question

2 Answers 2

up vote 16 down vote accepted

From the ssh_config(5) man page:

 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).

So:

Host XXX1 XXX2 XXX3
  HostName %h.YYY.com
share|improve this answer
1  
It appears the %h feature appeared in release 5.6 of OpenSSH. I was wondering why I hadn't seen it before - the version in Debian Squeeze is 5.5. –  jw013 Jan 17 '13 at 20:09

Simply use *

See man ssh_config:

PATTERNS A pattern consists of zero or more non-whitespace characters, ‘*’ (a wildcard that matches zero or more characters), or ‘?’ (a wildcard that matches exactly one character). For example, to specify a set of declarations for any host in the “.co.uk” set of domains, the following pattern could be used:

       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"
share|improve this answer
    
Thanks! That seems to be what I need, but I still don't understand how to adapt it to my case. Do I use a question mark ? wherever I want it to be replaced by the pattern matched by the * sign? –  user815423426 Jan 17 '13 at 18:59
    
Hmm. I think patterns serves a different purpose from what I need. They redirect multiple queries to the same config entry, but the parameters of the Host are fixed (i.e. patterns cannot be used to template the parameters). Am I wrong? –  user815423426 Jan 17 '13 at 19:03
1  
@user27915816 Yes, you are right, there is no way to do "templates" as far as I know. The best you can do is separate out the constant lines into a single Host * entry, and have a separate entry for each Host XXX that consists only of the parts that vary (i.e. the Hostname XXX.YYY.ZZZ line). –  jw013 Jan 17 '13 at 19:47

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.