J'ai un serveur, nommé gamma
, constamment opérationnel et au travail. Parfois, je m'y connecte depuis chez moi, auquel cas j'utilise l'adresse IP publique 55.22.33.99
. Parfois, je me connecte à quand je suis au travail, et plutôt que de rebondir mes paquets autour inutilement, je me connecte via l'adresse IP locale, 192.168.1.100
.
Pour le moment, je les ai divisés en deux entrées différentes dans ~/.ssh/conf
Host gamma-local
HostName 192.168.1.100
Port 22
User andreas
Host gamma-remote
HostName 55.22.33.99
Port 12345
User andreas
Donc, si je suis au travail, tout ce que je dois taper est ssh gamma-local
et je suis; si je suis à la maison (ou ailleurs dans le monde), je cours ssh gamma-remote
.
Lors de la connexion au serveur, je préfère ne pas avoir à taper un nom différent selon l'endroit où je suis, je préfère que la partie se fasse automatiquement; par exemple, dans certains cas, j'ai des scripts automatisés qui se connectent sans savoir où je suis.
Il y a une question qui résout ce problème en utilisant un script Bash pour "essayer" de se connecter d'abord au local, et s'il ne se connecte pas, essayez de vous connecter à l'adresse IP distante. C'est bien, mais (1) semble inefficace (d'autant plus que parfois vous devez "attendre" que les connexions expirent car elles ne renvoient pas toujours immédiatement une erreur) et (2) nécessite Bash et traîner le script.
Existe-t-il un autre moyen d'y parvenir qui ne repose pas sur l'utilisation de scripts Bash, ni sur des "tests" pour voir si la connexion fonctionne en premier?
/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é?Réponses:
Si vous avez un moyen de reconnaître le réseau sur lequel vous vous trouvez, vous pouvez utiliser le
Match
mot - clé~/.ssh/config
pour faire ce que vous voulez. Cela nécessite OpenSSH ≥6,5.J'utilise quelque chose de similaire à
J'utilise donc l'identifiant du réseau wifi utilisé pour décider si je suis à la maison aux fins de la connexion SSH, mais la vérification de l'adresse IP attribuée à votre ordinateur ou de toute autre chose qui différencie les deux réseaux peut également être utilisée .
la source
Match
, merci! Il pourrait être judicieux d'envelopper la détection dans un script sortant avec un état de sortie nul ou non nul, car cela le rendrait réutilisable.ProxyCommand nc $address ssh
, mais alors par exemple. tous les appareils ont-ils la même clé d'hôte? Si vous devez de toute façon définir une variable d'environnement, ne sera-t-il pas plus facile de simplement donner l'adresse à laquelle se connecter directement comme argumentssh
?Si vous avez un serveur de noms privé au travail et si vous utilisez le même ordinateur portable au bureau et à la maison, vous pouvez en profiter pour y parvenir:
nsswitch.conf
dans votre machine pour enregistrer le DNS en premiergamma
résoudre en 192.168.1.100 dans votre DNS privé au bureau.gamma
en 55.22.33.99.De cette façon, lorsque vous
ssh gamma
partirez du bureau, il résoudra du DNS du bureau vers le 192.168.1.100 et lorsque vous vous connectez depuis votre domicile, il se résoudra en 55.22.33.99 à partir de votre fichier d'hôtes.PS : Cette réponse suppose que vous ne voulez pas que gamma ait une entrée DNS publique. De plus, si vous vous connectez à votre serveur à partir d'une machine Windows, je pense qu'il devrait y avoir un endroit équivalent au fichier nssswitch.conf pour remplacer les entrées du fichier hôtes.
la source
Je ne sais pas s'il est possible de le faire,
~/.ssh/config
mais une autre approche serait de se connecter à l'un ou à l'autre en fonction de votre adresse IP externe. Étant donné que, probablement, lorsque vous êtes au travail, votre adresse IP sera55.22.33.NNN
, vous pouvez exécuter quelque chose comme:Une approche encore plus simple consiste à utiliser votre adresse IP interne. Je ne sais pas comment vos deux réseaux sont configurés, mais s'il est facile de déterminer si vous êtes au travail ou non via votre IP (par exemple, si vous avez une IP spécifique au travail, par exemple
192.168.1.12
), vous pouvez le faire ( changereth0
le nom de votre carte réseau):Quelle que soit votre décision, vous pouvez l'ajouter en tant qu'alias à votre shell (ajoutez cette ligne au fichier d'initialisation de votre shell,
~/.bashrc
si vous utilisezbash
):Vous pouvez également en faire un script si vous souhaitez que d'autres scripts y aient accès (les alias de
.bashrc
ne sont pas lus lors de l'exécution d'un script).la source
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 exemplednsmasq
) 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):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.la source
gamma
pour correspondre au port distant si cela rendait les choses plus faciles.Il y a quelques années, j'ai écrit un programme dans un but similaire. Cela pourrait répondre à vos besoins. Avec ce programme, la configuration ssh pourrait ressembler à ceci:
la source
Une autre solution consiste à utiliser deux fichiers de configuration différents pour SSH. Vous pourriez considérer cela un peu moins élégant que d'avoir tout dans un seul fichier de configuration, mais c'est plus facile à maintenir.
Vous sélectionnez le fichier de configuration que vous souhaitez utiliser avec
-F <configfile>
.la source
-F
option.Réponse partielle:
De nombreuses réponses ci-dessus commencent par "si vous pouvez détecter le réseau sur lequel vous vous trouvez". Pour cela, j'utilise un script qui s'exécute lorsque les interfaces sont connectées pour démarrer diverses choses (VPN, généralement) lorsque je me connecte à l'un de mes réseaux habituels. La technique consiste à utiliser ARP pour obtenir l'adresse MAC de la passerelle:
Et puis j'ai une table de recherche pour associer le réseau à la passerelle MAC. Bien sûr, cette table peut contenir plusieurs MAC pour le même réseau (le cas typique est les différents hotspots Wifi sur un grand site d'entreprise). Une autre table de recherche est utilisée pour déterminer le script à exécuter pour ce réseau.
Dans mon cas, le script est exécuté à l'aide des notifications du bureau Plasma, donc tout est dans le pays utilisateur.
la source