scripting automation ssh gnu-screen

scripting - Utilizando GNU Screen de forma completamente transparente y automática.



automation ssh (9)

Depende de tu shell, pero ¿qué pasa con .bashrc? (Si usas bash "screen -rd")

La pantalla es increíble, por supuesto, pero no quiero tener que pensar en ello. A menudo acudo a una máquina, comienzo a hacer un montón de cosas y luego pienso: "Dios mío, desearía haber pensado en iniciar una sesión de pantalla antes de hacer todo eso para poder volver a conectarme a esto desde casa más tarde".

Me gustaría que la pantalla se inicie automáticamente cada vez que inicie sesión en una máquina. Y cuando me desconecto, quiero poder volver a conectarme de forma inmediata y sencilla sin tener que preocuparme con "screen -ls" y "screen -dr".

Tengo un script que implementa una solución a este problema que publicaré como respuesta. Estoy interesado en ver otros enfoques.


En realidad, la pantalla establece la variable TERM en ''pantalla''. Así que el guión es aún más fácil. Aquí está lo que yo uso:

if [ "$TERM" != "screen" ]; then screen -xRR fi

Funciona como un amuleto, el -x garantiza que incluso si la pantalla está unida a otro lugar, la adjunto aquí. De esta manera solo tengo una pantalla donde puedo hacer un seguimiento de todo.


He usado autossh, me es muy útil.


Tal vez ponga exec screen -dr en su .login?


Tengo lo siguiente en mi .bashrc

if [ "$PS1" != "" -a "${_STARTED_SCREEN:-x}" = x -a "${SSH_TTY:-x}" ] then export _STARTED_SCREEN=1; sleep 1 screen -RR && exit 0 # normally, execution of this rc script ends here... echo "Screen failed! continuing with normal bash startup" fi

Lo encontré en línea en algún lugar hace un tiempo, no estoy seguro de dónde.

Error fijo de actualización que se señaló en los comentarios. Gracias r. Paté


Yo uso mosh (shell móvil) . Mantiene su conexión activada incluso si va al modo de suspensión, se desconecta de la red, cambia la IP, etc. Cada vez que regresas, recuperas tu conexión.


hay autossh que vuelve a conectar automáticamente ssh-session desconectado.

Viene con un script de ejemplo llamado rscreen que hace exactamente eso. Es sencillo:

#!/bin/sh autossh -M 0 -t $1 "screen -e^Aa -D -R"

Luego tienes que rscreen hostname a entrenar tus dedos para escribir rscreen hostname lugar de ssh hostname


Use lo siguiente, ssc , en lugar de ssh . Si solo haces " ssc remote.com ", se enumerarán las sesiones de pantalla existentes. Déle un tercer argumento y se conectará a esa sesión de pantalla, o lo creará y se conectará a él. De cualquier manera, si se desconecta, puede simplemente hacer "flecha arriba, ingresar" en el shell para volver a conectarse. Cero conocimiento de la pantalla requerida! Edición: Gracias a @klochner por extender esto para manejar opciones ssh arbitrarias. Ahora puedes usar esto como ssh!

#!/usr/bin/env perl # Use ''ssc'' (this script) instead of ''ssh'' to log into a remote machine. # Without an argument after the hostname it will list available screens. # Add an argument after the hostname to attach to an existing screen, or # specify a new screen. Eg, ssc remote.com foo # The numbers in front of the screen tag can usually be ignored. # ssh option parsing by @klochner my $optstring = ""; while ($val = shift) { if ($val =~ /^-/w$/) { $optstring .= " ".$val.(shift); } elsif ($val =~ /^-/w+$/) { $optstring .= " ".$val; } elsif ($machine) { $tag = $val; } else { $machine = $val; } } if (!$machine) { print "USAGE: ssc [ssh options] remote.com [screen name]/n"; } elsif (!$tag) { @screens = split("/n", `ssh $optstring $machine screen -ls`); for(@screens) { if(/^/s*(/d+)/.(/S+)/s+/(([^/)]*)/)/) { ($num, $tag, $status) = ($1, $2, $3); if($status =~ /attached/i) { $att{"$num.$tag"} = 1; } elsif($status =~ /detached/i) { $att{"$num.$tag"} = 0; } else { print "Couldn''t parse this: $_/n"; } # remember anything weird about the screen, like shared screens if($status =~ /^(attached|detached)$/i) { $special{"$num.$tag"} = ""; } else { $special{"$num.$tag"} = "[$status]"; } } } print "ATTACHED:/n"; for(sort { ($a=~//.(/w+)/)[0] cmp ($b=~//.(/w+)/)[0] } keys(%att)) { ($tag) = //.(/w+)/; print " $tag/t($_)/t$special{$_}/n" if $att{$_}; } print "DETACHED:/n"; for(sort { ($a=~//.(/w+)/)[0] cmp ($b=~//.(/w+)/)[0] } keys(%att)) { ($tag) = //.(/w+)/; print " $tag/t($_)/t$special{$_}/n" unless $att{$_}; } } else { system("ssh $optstring -t $machine /"screen -S $tag -dr || screen -S $tag/""); }

Por cierto, hay un truco para forzar una sesión ssh para salir y devolverle el aviso de su terminal local cuando pierde la conectividad de la red:
https://superuser.com/questions/147873/ssh-sessions-in-xterms-freeze-for-many-minutes-whenever-they-disconnect


ssh [email protected] -t ''screen -dRR''

Esto recargará / creará su sesión de pantalla al conectarse. Esto hace exactamente lo que se solicitó, incluso si transfiere la responsabilidad de generar la sesión al cliente iniciador. Idealmente, desearía algún proceso en el servidor que administre lo que se presenta a los clientes que se conectan. Por lo que yo sé, eso no existe. Nadie ha sugerido la solución ideal en este hilo. Para mí esto es menos "no ideal" que el resto. Sin scripts, sin errores, sin problemas de TTY, sin malas interacciones con otros comandos ssh, sin posibilidad de infinitos bucles, sin edición de archivos, no se requieren paquetes adicionales.