Автоматически (или более легко) повторно подключаться к сеансу экрана после прерывания сети
ДОБАВЛЕНО: этот вопрос теперь, я считаю, относится к этому: Использование экрана GNU полностью прозрачно и автоматически
Смотрите также этот вопрос:
https://superuser.com/info/147873/ssh-sessions-in-xterms-freeze-for-many-minutes-whenever-they-disconnect
Оригинальный вопрос:
Было бы неплохо, если бы был способ ssh на машину и сразу же подключиться к определенному сеансу экрана. Вы можете сделать это:
laptop> ssh server.com screen -ls
и он покажет список экранов, доступных на сервере .com, таким образом [1]:
123.pts-1
456.pts-2
И тогда вы можете попытаться сделать это:
laptop> ssh server.com screen -dr pts-2
но это не работает, говоря: "Должно быть подключено к терминалу".
Сначала вы должны сначала выполнить ssh, а затем выполнить "screen -dr pts-2" на сервере server.com, что небезопасно, если у вас сломанное соединение и вы сильно отключились. Вы хотите возобновить работу с помощью простого "стрелка вверх" на ноутбуке. (Или, возможно, сделать его еще более автоматическим.)
У меня есть неразрешимое решение этой проблемы, которое я выложу в качестве ответа, и надеюсь, что он будет занижен до забвения в пользу правильного способа справиться с этим.
Сноски:
[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"'
Ответы
Ответ 1
Использует ли параметр -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
Это похоже на мою установку.
Ответ 2
Теперь это относится к следующему: Использование экрана GNU полностью прозрачно и автоматически
Здесь script, ssc
, который работает так же, как ssh
, но принимает третий аргумент, чтобы указать экран для повторного подключения или имя нового экрана.
Я считаю, что этот script включает все в исходный вопрос.
#!/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 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 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\"");
}
Ответ 3
Используйте параметр -t
для ssh для выделения терминала при прямом запуске команды.
laptop> ssh -t server.com screen -dr pts-2
Ответ 4
Я работал над чем-то похожим, но не совсем понял, ваши решения решили мою проблему, поэтому здесь мое предложение:
ssh -t server.com "screen -S foo -rd || screen -S foo"
Это просто пытается открыть существующий экран с именем foo, и если он его не существует, он создает его.
Я положу это в пусковую установку на своем ноутбуке, поэтому, когда беспроводная сеть идет, я могу просто открыть, где я остановился.
Просто заметили, что оболочка экрана по умолчанию немного слаба, поэтому улучшение, которое настраивает вашу домашнюю среду немного лучше:
ssh -t server.com "screen -S foo -rd || screen -S foo bash -l"
Ответ 5
Я преобразовал это для работы с OS X.bash_profile с одним добавлением: если не указан второй параметр, он запустит сеанс "по умолчанию".
function ssc() {
if [[ -z $2 ]]; then
screen="default"
else
screen=$2
fi
ssh -t $1 "screen -S $screen -dr || screen -S $screen"
}
Ответ 6
Если вам нравится подключаться к тому же сеансу, всегда он активен, отсоединен или не существует:
ssh -t user @server screen -xR screenName
То же самое, но создайте новый сеанс, если он уже активен на каком-то другом pty:
ssh -t user @server screen -rR screenName