首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >网络中断后自动(或更容易)重新连接到屏幕会话

网络中断后自动(或更容易)重新连接到屏幕会话
EN

Stack Overflow用户
提问于 2009-01-23 22:56:32
回答 5查看 30.8K关注 0票数 56

补充说:我相信这个问题现在包含在这个问题上:Using GNU Screen completely transparently and automatically

另见这一相关问题:

https://superuser.com/questions/147873/ssh-sessions-in-xterms-freeze-for-many-minutes-whenever-they-disconnect

原题:

如果有一种方法可以将ssh连接到机器并立即重新连接到特定的屏幕会话,那就太好了。你可以这样做:

代码语言:javascript
复制
laptop> ssh server.com screen -ls

它将显示在server.com上可用的屏幕列表,如so 1

代码语言:javascript
复制
123.pts-1
456.pts-2

然后你可以尝试这样做:

代码语言:javascript
复制
laptop> ssh server.com screen -dr pts-2

但这是失败的,说“必须连接到终端。”您必须先在ssh中,然后在server.com上执行"screen server.com pts-2“,如果您有一个片状连接,并且经常断开连接,这是没有好处的。你想要在笔记本电脑上用一个简单的“向上箭头进入”来恢复。(或者让它更加自动化。)

对于这个问题,我有一个草率的解决方案,我将把它作为一个答案,并希望它被否决,以赞成正确的方法来处理这个问题。

脚注:

或者更好的是,如果您使用"screen -S foo“和"screen -S bar”这样的名称创建屏幕会话,那么您将得到一个更友好的列表,如:

代码语言:javascript
复制
123.foo
456.bar

并且可以重新连接,例如,"screen -dr foo“。

迷你屏幕教程,包含了这个问题的答案:

登录到server.com并做

代码语言:javascript
复制
screen -S foo 

然后就再也不要退出那个会议了。要从其他地方重新连接到它,请执行

代码语言:javascript
复制
ssh -t server.com screen -dr foo

列出要重新配置到的可用屏幕:

代码语言:javascript
复制
screen -ls

或者,当然,

代码语言:javascript
复制
ssh server.com screen -ls

远程查看server.com的可用屏幕。

我现在使用以下别名(tcsh) (基于以下Jason的回答)来连接到指定屏幕(如果存在),或者创建和连接其他名称的屏幕:

代码语言:javascript
复制
alias ssc 'ssh -t \!:1 "screen -S \!:2 -dr || screen -S \!:2"'
EN

回答 5

Stack Overflow用户

发布于 2009-07-02 17:56:10

这现在包含在以下内容中:Using GNU Screen completely transparently and automatically

下面是一个脚本,ssc,它的工作方式与ssh一样,但是使用第三个参数来指定要重新连接到的屏幕或新屏幕的名称。我相信这个剧本包含了最初问题中的所有内容。

代码语言:javascript
复制
#!/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\"");
}
票数 4
EN

Stack Overflow用户

发布于 2009-01-23 23:10:00

使用-t选项可以在直接运行命令时分配终端。

代码语言:javascript
复制
laptop> ssh -t server.com screen -dr pts-2
票数 2
EN

Stack Overflow用户

发布于 2009-03-12 18:25:24

我一直在做一些类似的事情,但还没有完全解决,你的解决方案已经解决了我的问题,下面是我的建议:

代码语言:javascript
复制
ssh -t server.com "screen -S foo -rd || screen -S foo"

这只是尝试打开名为foo的现有屏幕,如果它不存在,则创建它。我会把这个放在我的笔记本电脑上的发射器里,所以当无线网络运行时,我可以打开我停下来的地方。

刚刚注意到默认的屏幕外壳有点弱,所以设置您的家庭环境的一个改进是:

代码语言:javascript
复制
ssh -t server.com "screen -S foo -rd || screen -S foo bash -l"
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/474967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档