Comment détecter quand un shell appartient à une session SSH distante?

9

Ma question est similaire à celle-ci , mais je cherche quelque chose de légèrement différent. J'ai un ordinateur portable que j'utilise pour accéder aux machines Linux sur un réseau dans deux scénarios différents:

  • J'ai une connexion filaire directe au réseau.

  • J'ai une connexion indirecte au réseau. Il y a une machine passerelle sur le réseau exposée à Internet, que je peux utiliser pour établir des tunnels SSH vers les hôtes du réseau. Il s'agit évidemment d'une connexion beaucoup plus lente et à latence plus élevée.

Mon répertoire personnel est accessible sur le réseau depuis toutes les machines, ils partagent donc une copie de mon .bashrc. Je voudrais ajouter des fonctionnalités pour .bashrcdétecter lequel des deux scénarios je suis et agir en conséquence (techniquement, il y aurait trois scénarios, où le troisième est que je me connecte à ma machine locale, mais cela devrait être facilement géré ). J'aimerais faire des choses comme:

  • alias ssh ssh -X lorsque je suis sur le réseau local, mais je ne veux pas utiliser le transfert X sur Internet.

  • export EDITOR=gvimquand je suis sur le réseau local, mais export EDITOR=vimquand je suis distant.

Etc. Sur la base de la réponse précédente, il semble que je devrais être capable d'accomplir quelque chose comme ça en vérifiant le contenu de SSH_CLIENT(s'il existe) et en voyant si l'adresse IP du client correspond à l'un des adaptateurs réseau sur ma machine locale. J'ai pensé que je verrais s'il y a une façon plus élégante ou plus robuste d'accomplir cela.

Jason R
la source

Réponses:

10

Pour détecter une session SSH, utilisez $SSH_CLIENT.

Pour distinguer les sessions locales des sessions distantes, il existe deux approches possibles: côté client ou côté serveur. Côté serveur, comparez $SSH_CLIENTavec l'adresse IP locale ou la table de routage; cela vous indiquera généralement si la connexion provient du LAN. Côté client, vous souhaiterez peut-être mettre des ForwardX11paramètres dans votre ~/.ssh/config: définissez-le sur yespour les hôtes LAN et sur nopour les hôtes WAN. Cela implique d'avoir un site différent ~/.ssh/configsur différents sites; c'est ce que je fais, et je génère le mien avec un script shell.

Si le transfert X11 est activé pour les connexions LAN et désactivé pour les connexions WAN, vous pouvez configurer votre éditeur préféré pour qu'il $DISPLAYen tienne compte.

Les paramètres côté serveur iraient normalement dans votre .profile(ou .bash_profilesi votre shell de connexion est bash et que vous utilisez .bash_profile, ou .zprofilesi votre shell de connexion est zsh).

case ${SSH_CLIENT%% *}//$(/sbin/ifconfig |
                          sed -n 's/^.* addr:\([0-9][0-9.]*\) .*/\1/p' |
                          tr '\n' /)/ in
  "") :;;# local session
  10.42.*/10.42.*) :;; # LAN session
  1.2.3.*/1.2.3.*) :;; # LAN session
  *) unset DISPLAY;; # WAN session
esac
export EDITOR=vim
if [ -n "$DISPLAY" ] && type gvim >/dev/null 2>/dev/null; then
  EDITOR=gvim
fi
export VISUAL="$EDITOR"
Gilles 'SO- arrête d'être méchant'
la source
activé pour LAN et désactivé pour LAN? Le second devrait lire WAN - mais c'est une modification à un seul caractère ...
Nils