Como detectar quando um shell pertence a uma sessão SSH remota?

9

A minha pergunta é semelhante a esse aqui , mas estou procurando algo um pouco diferente. Eu tenho um notebook que uso para acessar máquinas Linux em uma rede em dois cenários diferentes:

  • Eu tenho uma conexão direta com fio à rede.

  • Eu tenho uma conexão indireta com a rede. Existe uma máquina de gateway na rede exposta à Internet, que eu posso usar para estabelecer túneis SSH para hosts na rede. Esta é obviamente uma conexão muito mais lenta e de maior latência.

Meu diretório pessoal pode ser acessado pela rede em todas as máquinas, então eles compartilham uma cópia do meu .bashrc . Eu gostaria de adicionar funcionalidade a .bashrc para detectar em qual dos dois cenários eu estou e agir de acordo (tecnicamente, haveria três cenários, em que o terceiro é que estou logando em minha máquina local, mas isso deve ser facilmente manipulado). Eu gostaria de fazer coisas como:

  • alias ssh ssh -X quando estou na rede local, mas não quero usar o encaminhamento do X pela Internet.

  • export EDITOR=gvim quando estou na rede local, mas export EDITOR=vim quando estou remoto.

E assim por diante. Com base na resposta anterior, parece que eu deveria ser capaz de realizar algo assim verificando o conteúdo de SSH_CLIENT (se existir) e verificando se o endereço IP do cliente corresponde a um dos adaptadores de rede em minha máquina local. Eu pensei em ver se há uma maneira mais robusta ou robusta de conseguir isso.

    
por Jason R 18.01.2012 / 00:42

1 resposta

10

Para detectar uma sessão SSH, use $SSH_CLIENT .

Para distinguir entre sessões locais e remotas, existem duas abordagens possíveis: do lado do cliente ou do lado do servidor. No lado do servidor, compare $SSH_CLIENT com o endereço IP local ou a tabela de roteamento; Isso geralmente informa se a conexão é da LAN. No lado do cliente, talvez você queira colocar ForwardX11 configurações em ~/.ssh/config : defina como yes para hosts da LAN e no para hosts WAN. Isso implica ter um% diferente ~/.ssh/config em sites diferentes; é o que eu faço, e eu gero o meu com um script de shell.

Se o encaminhamento do X11 estiver ativado para conexões LAN e desativado para conexões WAN, você poderá configurar seu editor favorito para considerar $DISPLAY .

As configurações do lado do servidor normalmente estariam no seu .profile (ou .bash_profile se o seu login shell for bash e você usar .bash_profile , ou .zprofile se o seu shell de login for zsh).

case ${SSH_CLIENT%% *}//$(/sbin/ifconfig |
                          sed -n 's/^.* addr:\([0-9][0-9.]*\) .*//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"
    
por 18.01.2012 / 03:13