Вопрос по ssh – Использование GNU Screen полностью прозрачно и автоматически

19

Экран, конечно, потрясающий, но я не хочу думать об этом. Я часто подключаюсь к машине, начинаю делать кучу вещей, а потом думаю: «Черт, я хотел бы подумать, чтобы начать сеанс экрана, прежде чем делать все это, чтобы я мог подключиться к этому из дома позже».

Я хотел бы, чтобы экран автоматически запускался при каждом входе в систему. И когда я отсоединяюсь, я хочу иметь возможность немедленно и просто переподключиться, не беспокоясь о "screen -ls" и "screen -dr".

У меня есть сценарий, который реализует одно решение этой проблемы, которое я опубликую в качестве ответа. Мне интересно видеть другие подходы.

Ваш Ответ

8   ответов
10

autossh который автоматически переподключает отключенные ssh-сессии.

Он поставляется с примером сценария под названиемrscreen который делает именно это. Это просто:

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

Затем вы должны переучить пальцы, чтобы набратьrscreen hostname вместоssh hostname

7

ценарий еще проще. Вот что я использую:

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

Работает как шарм,-x гарантирует, что даже если экран прикреплен где-то еще, я прикрепляю его здесь. Таким образом, у меня есть только один экран, на котором я могу отслеживать все.

Error: User Rate Limit Exceeded
0

но как насчет .bashrc? (Если вы используете bash & quot; screen -rd & quot;)

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededssh host 'echo hello world'Error: User Rate Limit Exceeded
14

Используйте следующее,ssc, вместоssh, Если вы просто сделаете & quot;ssc remote.com& Quot; тогда это перечислит существующие сеансы экрана. Задайте ему третий аргумент, и он подключится к экранной сессии или создаст его и подключится к нему. В любом случае, если вы отсоединились, вы можете просто нажать «стрелка вверх», ввести «quot; в оболочке для переподключения. Требуется нулевое знание экрана! Редактировать: Спасибо @klochner за расширение этого для обработки произвольных опций ssh. Теперь вы можете использовать это так же, как 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\"");
}

Кстати, есть хитрость, заставляющая сеанс ssh завершиться и вернуть вам приглашение локального терминала в случае потери сетевого подключения:
https://superuser.com/questions/147873/ssh-sessions-in-xterms-freeze-for-many-minutes-whenever-they-disconnect

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded dreeves
7
ssh [email protected] -t 'screen -dRR'

т именно то, что было запрошено, даже если он переносит ответственность за порождение сеанса на инициирующий клиент. В идеале вы хотели бы, чтобы на сервере был какой-то процесс, управляющий тем, что представляется подключающимся клиентам. Насколько я знаю, этого не существует. Никто не предложил идеальное решение в этой теме. Для меня это менее "не идеально" чем остальные. Нет сценариев, нет ошибок, нет проблем с TTY, нет плохого взаимодействия с другими командами ssh, нет возможности для бесконечных циклов, нет редактирования файлов, никаких дополнительных пакетов не требуется.

1

mosh (мобильная оболочка), Он поддерживает ваше соединение, даже если вы переходите в спящий режим, отключаетесь от сети, меняете IP и так далее. Всякий раз, когда вы вернетесь, вы получите обратно соединение.

1

exec screen -dr в вашем .login?

3

 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

Я нашел это где-то недавно, не уверен, где.

Update Исправлена ошибка, указанная в комментариях. Спасибо Р. Пэйт

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededmywiki.wooledge.org/Bashism

Похожие вопросы