¿Cómo detectar cuándo un shell es propiedad de una sesión SSH remota?

9

Mi pregunta es similar a esta , pero estoy buscando algo ligeramente diferente. Tengo una PC portátil que uso para acceder a máquinas Linux en una red en dos escenarios diferentes:

  • Tengo una conexión directa por cable a la red.

  • Tengo una conexión indirecta a la red. Hay una máquina de puerta de enlace en la red expuesta a Internet, que puedo usar para establecer túneles SSH a los hosts en la red. Obviamente, esta es una conexión mucho más lenta y de mayor latencia.

Mi directorio personal es accesible en red desde todas las máquinas, por lo que comparten una copia de mi .bashrc. Me gustaría agregar funcionalidad para .bashrcdetectar en cuál de los dos escenarios estoy y actuar en consecuencia (técnicamente, habría tres escenarios, donde el tercero es que estoy iniciando sesión en mi máquina local, pero eso debería manejarse fácilmente ) Me gustaría hacer cosas como:

  • alias ssh ssh -X cuando estoy en la red local, pero no quiero usar el reenvío X a través de Internet.

  • export EDITOR=gvimcuando estoy en la red local, pero export EDITOR=vimcuando estoy alejado.

Y así. Según la respuesta anterior, parece que debería poder lograr algo como esto al verificar el contenido de SSH_CLIENT(si existe) y ver si la dirección IP del cliente coincide con uno de los adaptadores de red en mi máquina local. Pensé que vería si hay una manera más ingeniosa o más sólida de lograr esto.

Jason R
fuente

Respuestas:

10

Para detectar una sesión SSH, use $SSH_CLIENT.

Para distinguir entre sesiones locales y remotas, hay dos enfoques posibles: del lado del cliente o del lado del servidor. En el lado del servidor, compare $SSH_CLIENTcon la dirección IP local o la tabla de enrutamiento; esto generalmente le dirá si la conexión es desde la LAN. En el lado del cliente, es posible que desee poner la ForwardX11configuración en su ~/.ssh/config: configúrelo yespara hosts LAN y nopara hosts WAN. Esto implica tener un sitio diferente ~/.ssh/configen diferentes sitios; eso es lo que hago, y genero el mío con un script de shell.

Si el reenvío X11 está activado para conexiones LAN y desactivado para conexiones WAN, puede configurar su editor favorito para que lo tenga $DISPLAYen cuenta.

La configuración del lado del servidor normalmente iría a su .profile(o .bash_profilesi su shell de inicio de sesión es bash y usted usa .bash_profile, o .zprofilesi su shell de inicio de sesión es 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- deja de ser malvado'
fuente
encendido para LAN y apagado para LAN? El segundo debería leer WAN, pero esa es una edición de un solo personaje ...
Nils