ssh - studio - Automáticamente(o más fácil) reconectar a una sesión de pantalla después de la interrupción de la red
visual studio installer (6)
¿La opción -t
hace lo que quieres?
-t Force pseudo-tty allocation. This can be used to execute arbi- trary screen-based programs on a remote machine, which can be very useful, e.g. when implementing menu services. Multiple -t options force tty allocation, even if ssh has no local tty.
Asi que:
laptop> ssh -t server.com screen -dr pts-2
Esto parece funcionar en mi instalación.
AGREGADO: Creo que esta pregunta está subsumida por esta: Usar la pantalla GNU de forma completamente transparente y automática
Ver también esta pregunta relacionada:
https://superuser.com/questions/147873/ssh-sessions-in-xterms-freeze-for-many-minutes-whenever-they-disconnect
Pregunta original:
Sería bueno si hubiera una forma de enviar ssh a una máquina e inmediatamente reconectarse a una sesión de pantalla específica. Puedes hacerlo:
laptop> ssh server.com screen -ls
y mostrará una lista de pantallas disponibles en server.com como [1]:
123.pts-1
456.pts-2
Y luego puedes intentar hacer esto:
laptop> ssh server.com screen -dr pts-2
pero eso falla, diciendo "Debe estar conectado a una terminal". Tienes que entrar primero y luego hacer la "pantalla -dr pts-2" en server.com, lo cual no es bueno si tienes una conexión escamosa y te desconectas mucho. Desea poder reanudar con una simple "entrada de flecha hacia arriba" en la computadora portátil. (O tal vez hacerlo aún más automático).
Tengo una solución falsa para este problema que publicaré como respuesta y espero que se reduzca al olvido a favor de la forma correcta de lidiar con esto.
Notas al pie: [1] O, mejor, si creó las sesiones de pantalla con nombres como " screen -S foo
" y " screen -S bar
", obtendrá una lista más amigable como:
123.foo
456.bar
y puede screen -dr foo
conectar con, por ejemplo, " screen -dr foo
".
Mini tutorial en pantalla, que incorpora la respuesta a esta pregunta:
Inicie sesión en server.com y haga
screen -S foo
y luego nunca cierra la sesión nuevamente. Para volver a conectarlo desde otro lugar, hazlo
ssh -t server.com screen -dr foo
Para enumerar las pantallas disponibles para reconectar a:
screen -ls
o, por supuesto,
ssh server.com screen -ls
para verificar las pantallas disponibles de server.com de forma remota.
Ahora uso el siguiente alias (tcsh), basado en la respuesta de Jason a continuación, para conectarme a una pantalla con nombre si existe o crear y conectar lo contrario:
alias ssc ''ssh -t /!:1 "screen -S /!:2 -dr || screen -S /!:2"''
Convertí esto para trabajar en OS X .bash_profile con una adición: si no se proporciona el 2º parámetro, se iniciará una sesión "predeterminada".
function ssc() {
if [[ -z $2 ]]; then
screen="default"
else
screen=$2
fi
ssh -t $1 "screen -S $screen -dr || screen -S $screen"
}
Esto ahora está subsumido por esto: Usar la pantalla GNU de forma completamente transparente y automática
Aquí hay un script,ssc
, que funciona igual que ssh
pero toma un tercer argumento para especificar la pantalla a la que volver a conectarse, o el nombre de una nueva pantalla. Creo que esta secuencia de comandos subsume todo en la pregunta original. #!/usr/bin/env perl
# Use ''ssc'' (this script) instead of ''ssh'' to log into a remote machine.
# Without a 3rd argument it will list available screens.
# Give it a 3rd argument 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.
# Screen is a little too clever though in that if there''s an existing screen "bar"
# and you say "ssc remote.com b" it will reconnect you to "bar" instead of making
# a new screen "b". It''s like invisible and silent tab-completion.
if(scalar(@ARGV)==0 || scalar(@ARGV) > 2) {
print "USAGE: ssc remote.com [screen name]/n";
} elsif (scalar(@ARGV) == 1) {
$machine = shift;
@screens = split("/n", `ssh $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"; }
}
}
print "ATTACHED screens:/n";
for(keys(%att)) { print " $_/n" if $att{$_}; }
print "DETACHED screens:/n";
for(keys(%att)) { print " $_/n" unless $att{$_}; }
} else {
$machine = shift;
$tag = shift;
system("ssh -t $machine /"screen -S $tag -dr || screen -S $tag/"");
}
He estado trabajando en algo similar pero no lo he logrado, tus soluciones han resuelto mi problema así que aquí está mi sugerencia:
ssh -t server.com "screen -S foo -rd || screen -S foo"
Esto solo trata de abrir la pantalla existente llamada foo y si no existe, la crea. Pondré esto en un iniciador en mi computadora portátil, así que cuando la red inalámbrica se apaga, puedo abrir donde lo dejé.
Me acabo de dar cuenta de que el caparazón de la pantalla por defecto es un poco débil, por lo que una mejora que configura un poco mejor su entorno doméstico es:
ssh -t server.com "screen -S foo -rd || screen -S foo bash -l"
Si desea conectarse a la misma sesión, siempre está activo, desconectado o no existe aún:
ssh -t pantalla del usuario @ servidor -xR screenName
Lo mismo, pero crea una nueva sesión si ya está activa en otro pty:
ssh -t usuario @ servidor pantalla -rR screenName
Utilice la opción -t
para ssh para asignar un terminal mientras ejecuta directamente un comando.
laptop> ssh -t server.com screen -dr pts-2