Existe-t-il un utilitaire pour envoyer une requête ping à un serveur utilisant des alias dans ssh config (au lieu de / etc / hosts)

4

J'essaie de standardiser les alias de mes serveurs sur tous les projets en liant des fichiers de configuration ssh que je peux conserver sous contrôle de version.

J'aimerais pouvoir définir des alias de machine ainsi que des adresses IP et des clés ssh au même endroit (les configs ssh). Cela fonctionne bien avec les utilitaires basés sur ssh comme / bin / ssh et (je crois) scp. Vous obtenez même la complétion de l'onglet.

Cependant, si je définis les alias dans ma configuration ssh, ils ne sont pas disponibles pour le ping et les autres utilitaires réseau vanilles. Je ne veux pas avoir à garder mon / etc / hosts synchronisé avec mes fichiers de configuration ssh.

Y a-t-il un moyen de

a) faire en sorte que les alias ssh fonctionnent automatiquement comme s'ils étaient dans / etc / hosts. ou b) trouvez une suite d’utilitaires réseau qui utilise la configuration ssh active comme source d’alias.

?

Peter Groves
la source
ssh_config n'est référencé que par les utilitaires ssh. Pourquoi ne pas utiliser / etc / hosts pour normaliser - que stockez-vous dans ssh_config au-delà du nom d’hôte?
Paul
Vous pouvez modifier votre configuration d'achèvement de shell pour utiliser ssh config, mais si ces noms ne sont pas résolus, vous n'avez toujours pas de chance. Je suggère également de synchroniser le fichier / etc / hosts si vous ne pouvez pas configurer votre propre serveur DNS pour cela.
Cougar
@Paul tardive, mais les raisons invoquées ci-dessus ressemblent à des bastions où vous auriez besoin d'utiliser ProxyCommand transférer sur le bastion pour parler au serveur. C'est en fait comme ça que je suis tombé sur cette question;)
ehime
@ehime Pourtant, l'approche n'a pas de sens. Le serveur / etc / hosts ou un serveur DNS est approprié pour stocker les conversions de nom en adresse IP et ssh_config pour gérer les tâches de ssh liées à ces hôtes. S'il existe de nombreux hôtes sur plusieurs serveurs, utilisez un serveur DNS public ou déployez-en un privé avec un maître / esclave sur plusieurs sites.
Paul

Réponses:

1

J'ai écrit une petite fonction shell qui fait exactement cela et peut être placée, par exemple. dans ton .bashrc.

Il remplace ping et fait la recherche du dernier argument (hôte) dans .ssh/config avant d'appeler l'original /bin/ping, c'est à dire. ping -c 2 <host> appellera /bin/ping -c2 <hostname><hostname> est l'IP / nom d'hôte correspondant dans .ssh/config. Si aucun hôte correspondant au dernier argument n’a été trouvé dans le fichier, la valeur initiale est utilisée comme avec standard. ping.

ping()
{
    # Process args
    local i=0
    local options=""
    local host=""
    for arg
    do
        i=$(($i+1))
        if [ "$i" -lt "$#" ]
        then
            options="${options} ${arg}"
        else
            host="${arg}"
        fi
    done

    # Find host
    local hostname=$(awk "\$1==\"Host\" {host=\$2} \$1==\"HostName\" && host==\"${host}\" {print \$2}" "$HOME/.ssh/config")
    if [ -z "$hostname" ]
    then
        hostname="$host"
    fi

    # Run ping
    /bin/ping $options $hostname
}
Andrzej Pronobis
la source