문제

물론 스크린은 놀랍지 만, 그것에 대해 생각하고 싶지는 않습니다. 나는 종종 기계에 ssh를하고, 많은 일을 시작한 다음, "gosh, 나는 나중에 집에서 다시 연결할 수 있도록 모든 일을하기 전에 스크린 세션을 시작했다고 생각했으면 좋겠다"고 생각한다.

컴퓨터에 로그인 할 때마다 화면을 자동으로 시작하고 싶습니다. 그리고 연결이 끊어지면 "screen -ls"및 "screen -dr"로 소란하지 않고 즉시 다시 연결할 수 있기를 원합니다.

이 문제에 대한 하나의 솔루션을 구현하는 스크립트가 있습니다. 다른 접근법을보고 싶습니다.

도움이 되었습니까?

해결책

다음을 사용하십시오. ssc, 대신에 ssh. 당신이 그냥한다면 "ssc remote.com"그러면 기존 화면 세션을 나열합니다. 세 번째 인수를 제공하면 화면 세션에 연결하거나 만들어 연결하고 연결합니다. 어느 쪽이든, 단절 해제되면"상향 애로우, 입력 "을 할 수 있습니다. 다시 연결하는 쉘. 스크린에 대한 제로 지식이 필요합니다! 편집 : 임의의 SSH 옵션을 처리하기 위해 이것을 확장 한 @klochner에게 감사합니다. 이제 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\"");
}

BTW, 네트워크 연결을 잃을 때 SSH 세션을 종료하고 로컬 터미널 프롬프트를 돌려주는 트릭이 있습니다.
https://superuser.com/questions/147873/ssh-sessions-in-xterms-freeze-for-many-minutes-whenethe-they-disconnect

다른 팁

거기 있습니다 autossh 연결이 끊긴 SSH 세션을 자동으로 다시 연결합니다.

이 예제 스크립트가 함께 제공됩니다 rscreen 정확히 그 일을합니다. 간단히 다음과 같습니다.

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

그런 다음 손가락을 재교육하여 타이핑해야합니다 rscreen hostname 대신에 ssh hostname

실제로 화면은 변수라는 용어를 '화면'으로 설정합니다. 스크립트가 훨씬 쉽습니다. 여기에 내가 사용하는 것은 다음과 같습니다.

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

매력처럼 작동합니다 -x 화면이 다른 곳에 첨부 되더라도 여기에 첨부하십시오. 이런 식으로 나는 모든 것을 추적 할 수있는 하나의 화면 만 가지고 있습니다.

ssh user@host.com -t 'screen -dRR'

Connect에서 화면 세션을 다시로드/작성합니다. 이것은 세션을 시작하는 책임을 초기 고객에게 전달하더라도 요청 된 것과 정확히 일치합니다. 이상적으로는 서버에서 연결 클라이언트에 제시되는 내용을 관리하는 프로세스를 원할 것입니다. 내가 아는 한 그것이 존재하지 않습니다. 이 스레드에서 이상적인 솔루션을 제안한 사람은 아무도 없습니다. 나에게 이것은 나머지보다 "이상적이지 않다"고 덜 "이상적이지 않다". 스크립트, 버그, TTY 문제 없음, 다른 SSH 명령과의 나쁜 상호 작용, 무한 루프 가능성, 파일 편집, 추가 패키지 없음.

.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

나는 어디에도 온라인에서 그것을 발견했는데 어디에 있는지 잘 모르겠습니다.

업데이트 주석에서 지적 된 고정 오류. 감사합니다 R. Pate

나는 Autossh를 사용했는데 그것은 나에게 매우 유용합니다.

어쩌면 넣을 수도 있습니다 exec screen -dr .login에서?

나는 사용한다 모시 (모바일 쉘). 절전 모드로 이동하여 네트워크에서 분리하고 IP 변경 등을 사용하더라도 연결을 유지합니다. 돌아올 때마다 연결을 다시받습니다.

껍질에 따라 다르지만 .bashrc는 어떻습니까? (Bash "Screen -RD"를 사용하는 경우)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top