¿Cómo usar efectivamente la pantalla y SSH?

12

Me gustaría configurar SSH y la pantalla de modo que un inicio de sesión siempre se vuelva a conectar a una sesión de pantalla. Idealmente, esa sesión no se cerraría sino que se separaría cuando presione Cd. ¿Cómo se puede lograr esto? ¿Y qué otras configuraciones útiles hay para facilitar mi vida SSH?

Tobias Kienzler
fuente

Respuestas:

9

Acabo de hacer lo siguiente para todos mis servidores para que cuando me conecte a través de SSH me coloquen automáticamente en una sesión de pantalla.

Agregue lo siguiente a ~ / .bashrc para sus cuentas de usuario:

# Auto-screen invocation. see: http://taint.org/wk/RemoteLoginAutoScreen
# if we're coming from a remote SSH connection, in an interactive session
# then automatically put us into a screen(1) session.   Only try once
# -- if $STARTED_SCREEN is set, don't try it again, to avoid looping
# if screen fails for some reason.
if [ "$PS1" != "" -a "${STARTED_SCREEN:-x}" = x -a "${SSH_TTY:-x}" != x ] 
then
  STARTED_SCREEN=1 ; export STARTED_SCREEN
  screen -RR -S main || echo "Screen failed! continuing with normal bash startup"
fi
# [end of auto-screen snippet]

Esto iniciará una sesión de pantalla llamada main si no existe o se volverá a conectar si lo hace. Esto se hizo porque tengo varias otras sesiones de pantalla ejecutándose de forma separada para varios servicios y no quería conectarme a ellas.

Daemon of Chaos
fuente
Solo quería agregar que la combinación de teclas CTRL-d es estándar en la pantalla para desconectarse de una sesión de pantalla en ejecución.
Daemon of Chaos
8

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 ifclá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 reattachfunció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-scriptcon 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 screensesión (asegurándose de que solo exista una). Cualquier argumento a la reattachfunció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 reattachfunción.

Arcege
fuente
4

Primero, si usa byobu, puede configurar una nueva sesión de shell para que siempre inicie byobu automáticamente (que es esencialmente una buena configuración de pantalla, aunque las versiones más nuevas pueden usar tmux como back-end). Si realmente no desea byobu, entonces probablemente pueda configurar la pantalla para conectarse manualmente editando su .profileu otro script de configuración de shell para exec screenif TERM != "screen".

Si no le gusta, puede usar el authorized_keysarchivo para ejecutar un comando específico para conexiones con una clave específica (y puede tener tantas claves como desee). Ver man sshdpara más detalles. Te sugiero que hagas que el comando ejecute un script que verifique si la pantalla se está ejecutando y se conecta, o si no comienza una nueva sesión.

En cuanto a la desconexión en Ctrl-D, la pantalla le permite configurar asignaciones de teclas en su .screenrc. Ver man screenpara más detalles. Estás buscando "bindkey".

ams
fuente
2

Tal vez sea totalmente irrelevante para su pregunta, pero ¿alguna vez ha considerado usar TMUX? Tiene una gran cantidad de funcionalidades que está buscando desde el primer momento.

P.ej. si se desconecta de una sesión SSH cuando está bajo TMUX, todo lo que necesita hacer es retroceder y ejecutar "tmux a" para adjuntarlo a su sesión. Desde que comencé a usar TMUX, olvidé qué son los comandos nohup / disown ... si necesita ejecutar algo y cerrar sesión, ejecútelo dentro de tmux y desconecte. El resultado del comando se almacenará en el búfer, por lo que puede revisarlo más tarde.

para adjuntar automáticamente puede agregar algo como a continuación a .bashrc:

[ -z $TMUX ] && tmux list-sessions 2>/dev/null && tmux a

o incluso más fácil

tmux a 2>/dev/null

Tiene menor huella de memoria y, en general, en mi humilde opinión, es mucho mejor / más fácil de usar.

El acceso directo de meta-d es la asignación predeterminada para separar en TMUX.

Alex
fuente
0

screen -dAr default || screen -AS defaultfunciona para mi. Agrego eso a mi ~ / .bashrc .

Explicando brevemente los interruptores:

  • d - Separe la pantalla si todavía está conectada, de otra sesión.
  • A - Adapte las ventanas en la pantalla al nuevo tamaño del terminal.
  • r default - Adjuntar a una pantalla llamada predeterminada.

Si el primer comando de pantalla (el anterior ||) no tiene éxito, se ejecuta el segundo:

  • A - Como se explicó anteriormente ...
  • S default- Cree la nueva sesión de pantalla con el nombre predeterminado .
Batandwa
fuente
0

Sugiero usar byobu . Esta herramienta utiliza tmux y proporciona una buena barra de herramientas y otras convenientes funciones de cambio de ventanas, teclas de acceso rápido, etc.

echo "new-session" >> ~/.byobu/.tmux.conf
echo "if [ -n '\$TMUX' ]; then :; else byobu attach; fi" >> ~/.bashrc

Con estos comandos anteriores después de un inicio de sesión SSH exitoso, el sistema intentará y se adjuntará a una sesión byobu-tmux existente, de lo contrario, creará una nueva sesión.

Sandeep
fuente