Plusieurs entrées similaires dans ssh config

193

Dites que je veux configurer mes sshoptions pour 30 serveurs avec la même configuration dans mon .ssh configfichier:

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

où la seule chose qui change entre ces 30 machines est XXX.

Au lieu de répéter 30 fois la structure ci-dessus dans mon configfichier, existe-t-il un autre moyen de définir une gamme de machines?

Amelio Vazquez-Reina
la source

Réponses:

232

De la ssh_config(5)page de manuel:

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

Alors:

Host XXX1 XXX2 XXX3
  HostName %h.YYY.com
Ignacio Vazquez-Abrams
la source
9
Il semble que la %hfonctionnalité est apparue dans la version 5.6 d’OpenSSH . Je me demandais pourquoi je ne l'avais pas vu auparavant - la version de Debian Squeeze est la 5.5.
jw013
2
Si vous utilisez un ancien système d'exploitation ou si vous avez besoin de règles non prises en charge config, vous pouvez toujours écrire un simple script qui génère votre config.
Roger Dahl
69

Pour minimiser la configuration, vous pouvez en avoir un .ssh/configcomme celui-ci.

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 ...pourrait être remplacé par Host *si chaque hôte a la configuration suivante

Guillaume Vincent
la source
2
Cela semble être la seule réponse qui aide réellement le PO (et moi-même).
Mad Physicist
Quel est l'ordre de priorité? Est-ce que ce sont des éléments définis ultérieurement dans le fichier qui remplacent les éléments définis précédemment dans le fichier? Comme si j'avais "Compression no" sous "Host X01", cela serait-il remplacé par "Compression yes" sous "Host X01 X02"?
Ben Farmer
1
Extrait du manuel de ssh_config: Comme la première valeur obtenue pour chaque paramètre est utilisée, davantage de déclarations spécifiques à l'hôte doivent être fournies au début du fichier, ainsi que des valeurs par défaut générales à la fin.
Guillaume Vincent
Peut Host X01 X02 ...être remplacé par *.YYY.com? Cela semble un peu plus gérable si cela fonctionne.
Michael
51

Simplement utiliser *

Voir man ssh_config:

MOTIFS Un motif est constitué de zéro ou plusieurs caractères non-blancs, '*' (un caractère générique qui correspond à zéro ou plus de caractères), ou '?' (un caractère générique qui correspond exactement à un caractère). Par exemple, pour spécifier un ensemble de déclarations pour tout hôte dans l'ensemble de domaines «.co.uk», vous pouvez utiliser le modèle suivant:

       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"
H.-Dirk Schmitt
la source
Merci! Cela semble être ce dont j'ai besoin, mais je ne comprends toujours pas comment l'adapter à mon cas. Est-ce que j'utilise un point d'interrogation ?partout où je veux qu'il soit remplacé par le motif correspondant au *signe?
Amelio Vazquez-Reina
2
Hmm. Je pense que les modèles servent un but différent de celui dont j'ai besoin. Ils redirigent plusieurs requêtes vers la même configentrée, mais les paramètres de l'hôte sont fixes (les modèles ne peuvent pas être utilisés pour modéliser les paramètres). Ai-je tort?
Amelio Vazquez-Reina
4
@ user27915816 Oui, vous avez raison, il n'y a aucun moyen de créer des "modèles" pour autant que je sache. Le mieux que vous puissiez faire est de séparer les lignes constantes en une seule Host *entrée et d’avoir une entrée distincte pour chaque Host XXXélément composé uniquement des parties qui varient (c’est-à-dire la Hostname XXX.YYY.ZZZligne).
jw013
Cette page est le premier résultat (pour le moment) lorsque vous recherchez "des caractères génériques de configuration ssh" dans Google, alors merci de fournir une réponse qui répond à cette question.
vastlysuperiorman
9

À partir des réponses de Ignacio Vazquez-Abrams et H.-Dirk Schmitt, on peut ajouter ce qui suit à .ssh / config

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

puis, par exemple, vous pouvez vous connecter en tant que [email protected] en

ssh XXX2
Vito Chou
la source
puisque XXX * implique XXX.YYY.com déjà, HostName ne devrait être %h, non%h.YYY.com
biocyberman
8

cela fonctionne pour moi:

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

hôte * .xxx.auckland.ac.nz
   utilisateur myuser
hôte * .yyy.auckland.ac.nz
   utilisateur myuser

Cela permet d'utiliser des noms dans le domaine et de changer le nom d'utilisateur:

bluebottle: ~ user_one $ ssh itslogprd05
Le mot de passe de [email protected]: 
Russell Fulton
la source
C'est la meilleure réponse pour moi. Je me suis débarrassé du script que j'avais l'habitude d'utiliser pour générer ma config!
Jooks
Et si un itslogprd05hôte existe dans les deux domaines? xxx.auckland.ac.nzgagne, je suppose?
Levente Huszko