¿Cómo puedo iniciar una sesión de pantalla con un comando sobre ssh en un servidor remoto desde mi escritorio?

57

Quiero poder iniciar sesiones de pantalla en servidores remotos desde un solo comando ssh en mi escritorio. Sin embargo, la pantalla parece necesitar un terminal, que no está disponible cuando se ejecuta un comando a través de ssh.

Entonces lo obvio

ssh [email protected] screen "tail -f /var/log/messages"

(como ejemplo) no funciona y da

Must be connected to a terminal.

Quiero que ssh inicie el comando en una pantalla para poder iniciar sesión más tarde y adjuntarlo como lo haría a una sesión de pantalla que habría lanzado manualmente.

Thomas Vander Stichele
fuente
Por otro lado, puede golpear este error no a través del mal uso de la pantalla. Tenía una función de shell que estaba haciendo exec <foo para leer desde un archivo. Mucho más tarde, en un script grande, intenté iniciar la pantalla. Todos los métodos a continuación obv. falló ya que el verdadero culpable era el ejecutivo. Uno a tener en cuenta. Comprueba que no has matado tu propio stdin sin querer.
Neil McGill

Respuestas:

77

Intente usar la opción -t para ssh

ssh -t [email protected] screen "tail -f /var/log/messages"

Del hombre ssh

-t Fuerza la asignación de pseudo-tty. Esto se puede usar para ejecutar arbi-
        controlar programas basados ​​en pantalla en una máquina remota, que puede ser
        muy útil, por ejemplo, al implementar servicios de menú. Múltiple -t
        las opciones fuerzan la asignación de tty, incluso si ssh no tiene tty local.
Kjetil Joergensen
fuente
Estoy intentando lo mismo con tmux ssh -t user@machine tmux attachy puedo adjuntar una sesión remota de tmux, pero se mete con la codificación de caracteres. Solo muestra caracteres ascii. ¿Hay alguna solución para esto?
Macario
1
@Macario es posible que desee abrir una pregunta separada para esto, mientras que está tangencialmente relacionado mientras lo está ejecutando con ssh -t, suena más como si estuviera relacionado con la configuración de LC_ * de manera diferente para ejecutarse interactivamente o no interactivamente. Cuando pasa una línea de comandos a ssh para ejecutar, se ejecutará con el entorno no interactivo. También es posible que sea la falta de la variable de entorno TERM que se pasa cuando se ejecuta de forma no interactiva, en cuyo caso tmux no tendría idea de qué capacidades tiene realmente su terminal, y recurre al denominador menos común.
Kjetil Joergensen
No estoy usando ssh pero enfrenta el mismo problema. Por favor ayuda. serverfault.com/questions/861632/unable-to-run-code-in-screen
zhangjinzhou
32

Puedes usar:

ssh root@host screen -m -d "tail -f /var/log/messages"

Eso inicia una pantalla separada con un comando ejecutándose en ella.

   -m   causes screen  to  ignore  the  $STY  environment  variable.  With
        "screen  -m"  creation  of  a  new session is enforced, regardless
        whether screen is called from within  another  screen  session  or
        not.  This  flag has a special meaning in connection with the `-d'
        option:

   -d -m   Start screen in "detached" mode. This creates a new session but
           doesn't  attach  to  it.  This  is  useful  for  system startup
           scripts.
Alakdae
fuente
1
Tu respuesta fue igual de buena, muy mal, tengo que elegir. Tal vez alguien debería editar la primera respuesta y agregar su información.
Thomas Vander Stichele
8

Respuesta tardía, pero esto es lo que hago, hago un alias (llamémoslo t) que hace esto:

ssh $MYSERVER -a -x -t screen -xRR -A -e^Zz -U -O

Esto le indica sshque deshabilite el reenvío de agente y X11, y screenque se adjunte a una sesión en ejecución, inicie una nueva si es necesario, úsela ^Zcomo comando de ruptura, use UTF-8 y sea inteligente con el terminal.

Todo esto significa que puedo abrir una terminal, escribir ty abrirá mi sesión de pantalla en $ MYSERVER. Entonces puedo abrir otra terminal, hacer lo mismo y obtener otra ventana para la misma sesión.

Es realmente agradable tener múltiples ventanas de terminal en la misma sesión de pantalla para poder ver dos pestañas de pantallas al mismo tiempo.

w00t
fuente
1
Leí algunas páginas que no respondían lo que estaba buscando, pero lo conseguiste. Supongo que la pantalla o tmux probablemente esté en la mayoría de los servidores en estos días, y los que me conecto son potencialmente efímeros, por lo que no quería meterme con el bashrc como sugieren la mayoría de las respuestas. También puede hacer que esto sea una función en su shell y aceptar argumentos como $ host y $ command (que pondría al final). Y en lugar de codificar su alias, tque es un único host, puede combinarlo con nombres de host en su ssh_config.
dragon788
@ dragon788 de hecho, lo convertí en una función ahora y reemplacé $ MYSERVER con "$ @". Todavía uso este mucho.
w00t
4

Al poner lo siguiente en el archivo ~ / .bashrc en mi servidor, se inicia una sesión de pantalla la primera vez que inicio sesión en el servidor, o si ya se está ejecutando, me vuelve a conectar a esa sesión.

Esto me parece muy útil:

if [ -n "$SSH_CONNECTION" ] && [ -z "$SCREEN_EXIST" ]; then
    export SCREEN_EXIST=1
    screen -DRi
fi
Brent
fuente
Intenté esto, pero cuando lo hago, screen -lsentonces no veo ninguna sesión de pantalla
Tarun