自动(或更容易)重新连接到网络中断后的屏幕会话
-
19-08-2019 - |
题
增加:这个问题是现在,我相信,通过这一个所包含的: 利用GNU屏幕完全透明和自动
又见此相关的问题:点击 https://superuser.com/questions/ 147873 / SSH-会话合的xterms冻结换许多 - 分钟 - 每当-它们断开
原始问题:
如果有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,然后做了“屏幕-dr PTS-2” server.com如果你有一个不正常的连接和断开连接很多是没有好处的。你希望能够在笔记本电脑上恢复与简单的“向上箭头进入”。 (或者,也许使它更加自动的。)
我有一个rihackulous解决这个问题,我会后作为回答,并希望它得到downvoted有利于正确的方式来遗忘处理这个。
脚注:
[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
要列出可用的屏幕到reconect为:
screen -ls
或,当然,
ssh server.com screen -ls
以核实server.com的远程可用的屏幕。
我现在使用下面的别名(tcsh),在基于以下贾森的回答,连接到一个已命名的屏幕,如果它存在,或者创建和连接其他方式:
alias ssc 'ssh -t \!:1 "screen -S \!:2 -dr || screen -S \!:2"'
解决方案
是否-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
这似乎在我的安装工作。
其他提示
这现在是由该所包含的/ p>
这里有一个脚本,
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"
我转换这个被一个另外在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"
}
如果您想要连接到同一个会话总是甚至是活动的,拆卸或尚未存在:
的ssh -t用户@服务器屏幕-XR屏幕名
在相同的,但创建新的会话,如果它已经处于活动状态的一些其他PTY:
的ssh -t用户@服务器屏幕-RR屏幕名