¿Cómo puedo ejecutar un script inmediatamente después de conectarme a través de SSH?

24

Comencé a hacer esta pregunta pero la respondí mientras la tenía abierta. Voy a publicar esta pregunta, seguir con mi solución y dejarla abierta a otras posibles soluciones.

<historia de fondo>

Soy un usuario de tmux y vim. Me gusta el trabajo remoto de vim, ya que no tengo que preocuparme de que las máquinas de desarrollo de Ubuntu se apaguen cuando una película flash me da pánico en el núcleo. Ejecutar tmux significa que los archivos abiertos me están esperando después de reiniciar y puedo continuar desde donde lo dejé. He tenido problemas con vim ejecutándose en una sesión tmux cuando me conecto así:

ssh example.com -t 'tmux attach'

UTF-8 genera problemas que no surgen cuando se bombardea normalmente y solo se adjunta a una sesión tmux manualmente.

</ historia de fondo>

Por lo tanto, quiero un método reutilizable para iniciar algo en el inicio de sesión ssh, que no afecte a ninguna de las otras cosas que configuré en mi .zshrc(o su .bashrcsi todavía usa bash) que pueden ser necesarias para mi entorno de desarrollo, eso no aparece cuando ocasionalmente estoy trabajando localmente en la misma máquina.

connrs
fuente

Respuestas:

13

Cuando ejecuta ssh example.com, el demonio ssh inicia un shell de inicio de sesión para usted, y el shell de inicio de sesión lee su ~/.profile(o ~/.bash_profileo ~/.zprofileo ~/.logindependiendo de su shell de inicio de sesión). Cuando especifica un comando para ejecutar de forma remota (con o sin -t), el demonio ssh inicia un shell normal, por .profilelo que no se lee. Remedio:

ssh example.com -t '. /etc/profile; . ~/.profile; tmux attach'

La mayoría de los demonios ssh están configurados para rechazar la transmisión de variables de entorno, excepto LC_*. Si el ssh daemon on lo example.compermite, puede abusar de una LC_*variable personalizada para iniciar tmux automáticamente. Ponga esto en su ~/.profile:

if [ -n "$LC_tmux_session" ] && tmux has -t "$LC_tmux_session"; then
  exec tmux attach -t "$LC_tmux_session"
elif [ -n "${LC_tmux_session+1}" ] && tmux has; then
  exec tmux attach
fi

luego inicie sesión con LC_tmux_session= ssh example.como LC_tmux_session=session_name ssh example.com.

Esta respuesta tiene más información sobre cómo pasar variables de entorno a través de ssh.

Gilles 'SO- deja de ser malvado'
fuente
La razón por la que no estoy usando no ssh example.com -t 'tmux attach'es porque tenga problemas para cargar mi entorno, sino porque he tenido problemas con la visualización de caracteres UTF-8; Este problema no existe cuando se conecta de la manera convencional. Es por eso que esta pregunta se trata de ejecutar scripts inmediatamente después de conectarse a través de SSH.
Connrs
Aunque me encanta tu solución. Elegante
connrs
@connrs: ¿Tiene problemas con UTF-8 incluso cuando ejecuta su .profile? Supuse que el problema se debía a configuraciones regionales configuradas incorrectamente en la máquina de destino, que se solucionó /etc/profileo que .profilesolucionó. El problema del entorno local probablemente se puede solucionar con más información.
Gilles 'SO- deja de ser malvado'
Quería volver a la oficina para probar esto. Tiene toda la razón, el abastecimiento del perfil / etc / activa el comportamiento correcto. Ahora ha resuelto el problema que me motivó a hacer esta pregunta más genérica
2011
6

Anteriormente aconsejé configurar PermitUserEnvironment yesy agregar una variable de entorno en su ~/.ssh/environmenthasta que Eli Heady intervino con una mejor sugerencia en los comentarios a continuación.

Abra su .zlogin(bash: .bash_profileetc.) y ponga lo siguiente:

if [[ "$SSH_CONNECTION" != "" && "$MY_SSH_CONNECTION" != "yes" ]]; then
    while true; do
        echo -n "Do you want to attach to a tmux session? [y/n]"
        read yn
        case $yn in
            [Yy]* ) MY_SSH_CONNECTION="yes" tmux attach; break;;
            [Nn]* ) break;;
            * ) echo "Please answer y/n";;
        esac
    done
fi

Inspiración tomada de: ¿Cómo solicito la entrada en un script de shell de Linux?

Tenga en cuenta que he usado el .zloginarchivo, pero podría usar su .zshrcarchivo, pero me gusta mantener mis archivos de puntos ordenados y lo separa para poder usarlo en otras máquinas.

Reemplace la pregunta con algo apropiado para usted y reemplace MY_SSH_CONNECTION="yes" tmux attachcon lo que desee ejecutar en ese punto.

Tenga en cuenta cómo se establece el script MY_SSH_CONNECTION="yes"antes tmux attachde pasarlo a tmux, ya que también abrirá un shell que accederá al mismo script anterior y evitará cualquier recurrencia.

connrs
fuente
2
El uso de PermitUserEnvironment no será posible en algunos entornos debido a las posibles implicaciones de seguridad. SSH establece la variable $ SSH_CONNECTION, que se puede usar en lugar de su $ SSH_LOGIN en su .zlogin, obviando la necesidad de usar ~ / .ssh / environment. Algo así if [[ "$SSH_CONNECTION" != "" ]]debería hacerlo.
Eli Heady
3

Yo mismo, agrego esto a mis archivos .bash_profile:

if [ -z "$STY" ]; then
    reattach() { exec screen -A -D -RR ${1:+"$@"} ; }
fi
if [ -t 0 ]; then
    screen -wipe
    echo 'starting screen... (type Ctrl-C to abort)'
    sleep 5 && reattach
fi

Esto me da algo de tiempo para abortar volver a conectar o crear una sesión de pantalla. No funcionará en formatos 'ssh system command' (que no llama al perfil ~ /.*). Una función de shell está configurada para volver a conectar si aborto.

Arcege
fuente
¡Excelente! Me las arreglé para f * esto colocando bashrc en su lugar, y luego en cada nueva ventana de pantalla, cuando cambié a .profile funcionó bien.
Hugo
0

Podrías considerar correr

ssh remotehost -t screen -DR

y ejecuta tu sesión de terminal allí. Luego puede separar ( ^A^D) y volver a conectar más tarde (desde un cliente diferente también) Hará que el problema con la inicialización no interactiva desaparezca ya que la pantalla mantiene sesiones de terminal interactivas completas (opcionalmente, también shells de inicio de sesión, man screen(1) o ^A?)

sehe
fuente
Como mencioné en mi pregunta, estoy usando tmux en lugar de la pantalla GNU para administrar mis sesiones. Y cuando está cargado -t 'tmux attach'tengo problemas con vim que no están presentes normalmente. Es por eso que la verdadera pregunta es sobre la ejecución de scripts en ssh connect en lugar de la gestión de pantalla / sesión. Disculpas por no ser más claro en mi pregunta
contesta
Lo siento mucho, mencionaste tmux pero no significó nada para mí. ¡Gracias por mencionar una nueva herramienta!
sehe
0

Para hablar específicamente sobre los problemas de UTF-8, si agrega

SendEnv LANG

Y $LANGestá configurado en algo así como en_US.UTF-8en el extremo local y su sshd en el extremo remoto permite la SendEnvdirectiva (con AcceptEnvin sshd_config), el tmux en el otro extremo debería cumplirla. Tuve este problema por un tiempo y fue difícil de solucionar.

Chris W.
fuente
0

Si desea que se ejecute cada vez que se conecte, simplemente puede agregarlo tmux attacha la parte inferior de su ~/.profilemáquina remota.

lineas fuzzy
fuente