Créez dynamicment des inputs SSH Host dans ~ / .ssh / config

Je dois administrer un tas d'hôtes sur ssh. Cependant, je ne peux y accéder que par un certain server ssh de la passerelle.

J'ai le suivant dans mon ~/.ssh/config :

 Host mygateway-www Hostname www IdentityFile ~/.ssh/id_rsa ProxyCommand ssh mygateway nc %h 22 

Cependant, je dois me connecter à beaucoup de ces machines. Au lieu de mettre des dizaines d'inputs dans mon ~/.ssh/config , est-ce que, de toute façon, je peux avoir quelque chose comme ça:

 Host mygateway-* Hostname ???WHAT GOES HERE???? IdentityFile ~/.ssh/id_rsa ProxyCommand ssh mygateway nc %h 22 

Je sais que vous pouvez utiliser %h dans l'argument Hostname , mais ce serait le nom d'hôte. Ce dont j'ai vraiment besoin, c'est une sorte de substitution de string, comme bash ${VAR%thingie} . Est-ce possible?

Cela peut être fait avec le file de configuration SSH suivant:

 Host * ServerAliveInterval 120 Host gateway.somewhere.com User jdoe Host gateway+* User jdoe ProxyCommand ssh -T -a $(echo %h |cut -d+ -f1).somewhere.com nc $(echo %h |cut -d+ -f2) %p 2>/dev/null ControlMaster auto ControlPath ~/.ssh/ssh-control_%r@%h:%p 

Vous accédez alors à vos hôtes internes comme suit:

 ssh gateway+internalhost01.somewhere.com ssh gateway+internalhost02.somewhere.com 

Le nom que vous choisissez pour la moitié droite doit être résolu par l'hôte de saut.

Le paramètre Utilisateur est spécifié dans le cas où vous avez besoin de mapper manuellement à différents users sur les différentes classs d'hôtes. ControlMaster et ControlPath sont spécifiés pour permettre la réutilisation de la connection SSH.

Vous ne devez pas nécessairement spécifier spécifiquement HostName car il viendra de la command line.

Essayez simplement:

 Host *.domain IdentityFile ~/.ssh/id_rsa ProxyCommand ssh mygateway /usr/bin/nc %h 22 

Il semble qu'il n'y ait aucun moyen de le faire.

J'ai eu un problème similaire et j'ai fini par écrire un script qui m'a généré tous les éléments. Je ne change plus ~ / ssh / config, je change ~ / ssh / config.in et réexécute mon script.

J'ai eu un client avec la même configuration et j'ai utilisé DSSH pour résoudre mon problème.
DSSH entre autres choses vous permet de vous connecter de manière transparente à des hôtes distants via un hôte de passerelle.

Cas d'utilisation

  • Collectez les parameters de configuration des routeurs Cisco qui nécessitent une connection "ena"
  • Connectez-vous aux servers, qui ont PermitRootLogin désactivé directement en tant que root (en saisissant su-and password automatiquement), tout en préservant l'état de sortie
  • Ajoutez une logique personnalisée telle que la journalisation avancée
  • tunnel à travers plusieurs connections pour accéder au server cible