Автоматическое (или более простое) повторное подключение к сеансу экрана после прерывания сети
добавлено: этот вопрос теперь, я полагаю, подпадает под этот: Использование экрана GNU полностью прозрачно и автоматически
см. также это связано question:
https://superuser.com/questions/147873/ssh-sessions-in-xterms-freeze-for-many-minutes-whenever-they-disconnect
исходный вопрос:
было бы неплохо, если бы был способ ssh к машине и сразу же подключиться к определенному сеансу экрана. Вы можете сделать это:
laptop> ssh server.com screen -ls
и он покажет список экранов, доступных на server.com вот так [1]:
123.pts-1
456.pts-2
и тогда вы можете попробовать сделать это:
laptop> ssh server.com screen -dr pts-2
но это не удается, заявив, что "должен быть подключен к терминалу." Вы должны сначала ssh, а затем сделать "screen-dr pts-2" on server.com что нехорошо, если у вас есть слоеное соединение и много отключается. Вы хотите, чтобы иметь возможность возобновить с помощью простого "стрелка вверх введите" на ноутбуке. (Или, возможно, сделать его еще более автоматическим.)
у меня есть rihackulous решение этой проблемы, которое я опубликую в качестве ответа и надеюсь, что он будет понижен до забвения в пользу правильного способа справиться с этим.
Сноски:
[1] или, лучше, если вы создали сеансы экрана с такими именами, как "screen -S foo
" и "screen -S bar
" тогда вы получите более дружелюбный список, например:
123.foo
456.bar
и может подключиться, например, "screen -dr foo
".
мини-экран учебник, включающий ответ на этот вопрос:
войти в систему server.com и делать
screen -S foo
и затем никогда не выходите из этого сеанса снова. Чтобы подключиться к нему из другого места, сделайте
ssh -t server.com screen -dr foo
список доступных экранов для повторного подключения к:
screen -ls
или
ssh server.com screen -ls
для проверки server.com доступные экраны удаленно.
теперь я использую следующий псевдоним (tcsh), основанный на ответе Джейсона ниже, чтобы подключиться к именованному экрану, если он существует, или создать и подключить иначе:
alias ssc 'ssh -t !:1 "screen -S !:2 -dr || screen -S !:2"'
6 ответов:
тут
-t
вариант делать то, что вы хотите?-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.Так:
laptop> ssh -t server.com screen -dr pts-2
Это, кажется, работает в моей системе.
Это теперь подпадает под это:использование экрана GNU полностью прозрачно и автоматически
Вот скриптssc
, который работает так же, какssh
но принимает третий аргумент, чтобы указать экран для повторного подключения, или имя нового экрана. Я считаю, что этот сценарий охватывает все в исходном вопросе.#!/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) = (, , ); 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\""); }
использовать
-t
опция ssh для выделения терминала при непосредственном выполнении команды.laptop> ssh -t server.com screen -dr pts-2
Я работал над чем-то подобным, но не совсем туда попал, ваши решения решили мою проблему, поэтому вот мое предложение:
ssh -t server.com "screen -S foo -rd || screen -S foo"
Это просто пытается открыть существующий экран с именем foo и если он не существует, создает его. Я положу это в пусковую установку на своем ноутбуке, поэтому, когда беспроводная сеть пойдет, я могу просто открыть, где я остановился.
просто заметил, что оболочка экрана по умолчанию немного слаба, поэтому улучшение, которое настраивает Вашу домашнюю среду a немного лучше:
ssh -t server.com "screen -S foo -rd || screen -S foo bash -l"