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

9

Minha pergunta é semelhante a esta , 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. Há uma máquina de gateway na rede exposta à Internet, que eu posso usar para estabelecer túneis SSH para hosts na rede. Essa é obviamente uma conexão muito mais lenta e com maior latência.

Meu diretório pessoal é acessível em rede a partir de todas as máquinas, então eles compartilham uma cópia do meu .bashrc. Gostaria de adicionar funcionalidade para .bashrcdetectar em qual dos dois cenários eu estou e agir de acordo (tecnicamente, haveria três cenários, onde o terceiro é que eu estou logando na 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=gvimquando estou na rede local, mas export EDITOR=vimquando estou remoto.

E assim por diante. Com base na resposta anterior, parece que devo conseguir algo assim, verificando o conteúdo SSH_CLIENT(se existir) e verificando se o endereço IP do cliente corresponde a um dos adaptadores de rede na minha máquina local. Eu pensei que veria se existe uma maneira mais sólida ou mais robusta de fazer isso.

Jason R
fonte

Respostas:

10

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

Para distinguir entre sessões locais e remotas, há duas abordagens possíveis: do lado do cliente ou do servidor. No lado do servidor, compare $SSH_CLIENTcom o endereço IP local ou a tabela de roteamento; isso geralmente informa se a conexão é da LAN. No lado do cliente, convém colocar as ForwardX11configurações em ~/.ssh/config: configure-o yespara hosts da LAN e noWAN. Isso implica ter um diferente ~/.ssh/configem sites diferentes; é isso que faço, e gero o meu com um script de shell.

Se o encaminhamento X11 estiver ativado para conexões LAN e desativado para conexões WAN, você poderá configurar seu editor favorito para levar $DISPLAYem consideração.

As configurações do servidor normalmente entram no seu .profile(ou .bash_profilese o seu shell de login é bash e você o usa .bash_profile, ou .zprofilese o seu shell de login é 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- parar de ser mau'
fonte
ativado para LAN e desativado para LAN? O segundo deve ler WAN - mas isso é uma edição de caractere único ...
Nils