Tengo lo siguiente en mi .bash_profile en mis servidores remotos:
if [ -z "${STY}" -a -t 0 -a X${USER} = Xarcege ]; then
reattach() {
if [ -n "${SSH_AUTH_SOCK}" ]; then
ln -snf "${SSH_AUTH_SOCK}" "${HOME}/.ssh/agent-script"
SSH_AUTH_SOCK="${HOME}/.ssh/agent-script" export SSH_AUTH_SOCK
fi
exec screen -A -D -RR ${1:+"$@"}
}
screen -wipe
echo 'starting screen... (type Ctrl-C to abort)'
sleep 5 && reattach
fi
Esto hace dos cosas: primero, configura una función de shell para reemplazar el shell y llevar adelante la conexión ssh-agent, segundo llama a la función después de una pausa durante unos segundos (en caso de que no desee que se inicie la pantalla).
La primera if
cláusula será verdadera si aún no se está ejecutando screen ( -z "${STY}"
) está conectado a un terminal ( -t 0
) y no estoy ejecutando sudo (que a veces no cambia $USER
).
La reattach
función primero verificará si se llamó a ssh con un puerto ssh-agent active ( -n "${SSH_AUTH_SOCK}"
). Luego reemplazará lo que sea que esté ~/.ssh/agent-script
con el archivo de socket actualmente activo y reemplazará la variable de entorno ( $SSH_AUTH_SOCK
) con el nuevo valor. Luego, el script reemplazará el shell actual con una sola screen
sesión (asegurándose de que solo exista una). Cualquier argumento a la reattach
función se pasa al comando ( ${1:+"$@"}
).
La última parte primero elimina las sesiones muertas ( screen -wipe
), le permite al usuario (yo) saber que la pantalla se iniciará en breve y, en su lugar, puede regresar al shell presionando Ctrl- C. Luego espera 5 segundos y llama a la reattach
función.