네트워크 중단 후 자동으로 (또는 더 쉽게) 화면 세션에 다시 연결
ADDED :이 질문은 이제이 질문에 포함됩니다. GNU Screen을 완전히 투명하고 자동으로 사용
이 관련 질문도 참조하십시오 :
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를 입력 한 다음 server.com에서 "screen -dr pts-2"를 수행해야합니다. 연결이 불안정하고 연결이 많이 끊어지면 좋지 않습니다. 랩톱에서 간단한 "위쪽 화살표 입력"으로 다시 시작할 수 있기를 원합니다. (또는 더 자동으로 만들 수도 있습니다.)
나는이 문제에 대한 어리석은 해결책을 가지고 있으며 대답으로 게시 할 것이며 이것을 처리하는 올바른 방법에 찬성하여 망각에 찬성하기를 바랍니다.
각주 :
[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의 사용 가능한 화면을 원격으로 확인합니다.
이제 아래 Jason의 대답에 따라 다음 별칭 (tcsh)을 사용하여 명명 된 화면이있는 경우 연결하거나 그렇지 않은 경우 만들고 연결합니다.
alias ssc 'ssh -t \!:1 "screen -S \!:2 -dr || screen -S \!:2"'
-t
옵션이 원하는 것을 수행 합니까 ?
-t 의사 tty 할당을 강제합니다. 이것은 arbi-를 실행하는 데 사용할 수 있습니다. 원격 컴퓨터에서 화면 기반 프로그램을 검색 할 수 있습니다. 예를 들어 메뉴 서비스를 구현할 때 매우 유용합니다. 다중 -t 옵션은 ssh에 로컬 tty가없는 경우에도 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) = ($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\"");
}
-t
명령을 직접 실행하는 동안 ssh 옵션을 사용하여 터미널을 할당하십시오.
laptop> ssh -t server.com screen -dr pts-2
나는 비슷한 일을 해왔지만 거기에 도달하지는 못했습니다. 당신의 솔루션이 내 문제를 해결했기 때문에 여기에 내 제안이 있습니다.
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"
I converted this to work on OS X .bash_profile with one addition: If no 2nd parameter is given, it will start a session "default".
function ssc() {
if [[ -z $2 ]]; then
screen="default"
else
screen=$2
fi
ssh -t $1 "screen -S $screen -dr || screen -S $screen"
}
If you like to connect to the same session always even it is active, detached or not exists yet:
ssh -t user@server screen -xR screenName
The same but create a new session if it is already active on some other pty:
ssh -t user@server screen -rR screenName
ReferenceURL : https://stackoverflow.com/questions/474967/automatically-or-more-easily-reconnect-to-a-screen-session-after-network-inter
'UFO ET IT' 카테고리의 다른 글
파이썬의 문자열에서 ANSI 이스케이프 시퀀스를 제거하는 방법 (0) | 2021.01.09 |
---|---|
`is` 키워드는 타이프 스크립트에서 무엇을합니까? (0) | 2021.01.08 |
C #에 Dictionary <>와 같은 클래스가 있지만 키에만 값이 없습니까? (0) | 2021.01.08 |
루트가 아닌 권한으로 추적 된 명령을 실행하기 위해 dtrace를 얻으려면 어떻게해야합니까? (0) | 2021.01.08 |
GOOGLE로 HTML 소스에서 검색 하시겠습니까? (0) | 2021.01.08 |