GNU 화면을 완전히 투명하고 자동으로 사용합니다
-
21-08-2019 - |
문제
물론 스크린은 놀랍지 만, 그것에 대해 생각하고 싶지는 않습니다. 나는 종종 기계에 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"를 사용하는 경우)