Vous ne pouvez pas y parvenir ~/.ssh/config
lorsque vous utilisez des adresses IP comme noms d'hôtes. Une complication supplémentaire est introduite par le fait que vous ne vous connectez pas seulement à différentes adresses IP mais également à différents ports, car cela exclut à peu près tout ajustement de votre résolveur DNS.
Je suis corrigé - vous pouvez utiliser le Match originalhost ... exec ...
combo dans ~/.ssh/config
- voir la réponse de @ MichałPolitowski . Cependant, même si cela fonctionnera parfaitement pour OpenSSH, vous ne trouverez pas nécessairement des fonctionnalités similaires dans d'autres clients SSH.
Vous pouvez contourner le problème à l'aide d'un simple wrapper (soit une fonction shell ou un script si vous devez l'utiliser à partir de différents shells) ssh
, qui vérifiera sur quel réseau vous êtes et utilisera l' Host
entrée appropriée . La grande question est de savoir comment détecter de manière fiable le réseau sur lequel vous vous trouvez. L'adresse IP locale vient à l'esprit, mais n'est pas fiable, car vous pouvez également vous connecter à partir d'un LAN qui utilise le même sous-réseau que votre réseau de travail.
Si vous pouvez avoir le même port pour les réseaux locaux et distants, vous pouvez modifier votre en /etc/resolv.conf
fonction du réseau sur lequel vous vous trouvez - cela devrait évidemment être fait automatiquement (très probablement à partir d'un script de raccordement de votre client DHCP). Ou - mieux - exécutez le serveur de noms local (comme par exemple dnsmasq
) et fournissez-lui la configuration appropriée. Cela dépasse cependant la portée de cette question.
Une autre option - si vous avez seulement besoin de vous connecter de manière interactive - consiste à utiliser la complétion de commande qui scannerait ~/.ssh/config
. Cela vous éviterait de taper (surtout si vous avez suffisamment d' Host
entrées variables ). Quelque chose comme ça (pour l' bash
initialisation):
# complete session names for ssh
declare -g _ssh_complete_hostlist 2> /dev/null
function _ssh_complete_init () {
_ssh_complete_hostlist=$( \
sed -nr '/^\s*Host\s*=/{s/^[^=]+= *//;s/ /\n/g;p}' ~/.ssh/config \
| sort )
}
_ssh_complete_init
function _ssh_complete () {
local match=${COMP_WORDS[${COMP_CWORD}]}
local hosts=
local default=
for h in $_ssh_complete_hostlist; do
if [[ $h =~ ^$match ]]; then
hosts="$hosts $h"
fi
done
if ! (( ${COMP_CWORD} == ${#COMP_WORDS[@]}-1 )); then
default=$( compgen -f ${COMP_WORDS[${COMP_CWORD}]} )
fi
COMPREPLY=($hosts $default)
}
complete -F _ssh_complete ssh
La première fonction crée une liste à partir de laquelle les hôtes sont terminés (généralement il suffit de l'exécuter une fois dans chaque shell), la seconde effectue l'achèvement réel, mais de manière un peu maladroite - elle ne complète le nom d'hôte que lorsqu'elle est le dernier jeton sur la ligne de commande.
Cela dit, la bonne façon d'aborder ce problème est de se connecter au réseau professionnel via un VPN et d'avoir ainsi l'adresse IP professionnelle locale accessible comme si vous étiez au bureau. Vous pouvez ensuite raccorder directement l'adresse dans tout selon la couche que vous préférez: ~/.ssh/config
, /etc/resolv.conf
ou (AMHA meilleure option) serveur de noms de bureau.
/etc/hosts
ou le fichier de configuration SSH pour y parvenir? Ou peut-être un moyen de "détecter" le LAN auquel vous êtes actuellement connecté?