当前位置:  开发笔记 > 编程语言 > 正文

完全透明地自动使用GNU Screen

如何解决《完全透明地自动使用GNUScreen》经验,为你挑选了4个好方法。

屏幕很棒,当然,但我不想考虑它.我经常ssh到一台机器,开始做一堆东西,然后想"天哪,我希望我在做这一切之前想到开始一个屏幕会议,所以我可以在以后从家里重新连接到这个".

每当我登录到机器时,我都想自动启动屏幕.当我断开连接时,我希望能够立即简单地重新连接,而不必担心"screen -ls"和"screen -dr".

我有一个脚本,实现了这个问题的一个解决方案,我将作为答案发布.我很想看到其他方法.



1> dreeves..:

使用以下ssc,而不是ssh.如果您只是" ssc remote.com",那么它将列出现有的屏幕会话.给它一个第三个参数,它将连接到该屏幕会话,或创建它并连接到它.无论哪种方式,如果断开连接,您只需在shell中执行"向上箭头,输入"即可重新连接.需要零屏幕知识!编辑:感谢@klochner扩展此处理任意ssh选项.您现在可以像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\"");
}

顺便说一句,当你失去网络连接时,有一个强制ssh会话退出并让你回到本地终端提示的技巧:https:
//superuser.com/questions/147873/ssh-sessions-in-xterms-freeze-for-许多分钟,任何时候,而且它们断开



2> levinalex..:

autossh自动重新连接断开连接的ssh-sessions.

它带有一个示例脚本rscreen,它正是这样做的.它简单地说:

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

然后你必须重新训练你的手指rscreen hostname而不是ssh hostname



3> Feanil..:

实际上,屏幕将TERM变量设置为"屏幕".因此脚本更容易.这是我使用的:

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

像魅力一样工作,-x确保即使屏幕连接到我在这里附加的其他地方.这样我只有一个屏幕可以跟踪所有内容.



4> kevinlawler..:
ssh user@host.com -t 'screen -dRR'

这将在连接时重新加载/创建您的屏幕会话.这完全符合要求,即使它将产生会话的责任移交给初始客户端.理想情况下,您希望服务器上的某个进程管理向连接客户端呈现的内容.据我所知,不存在.没人在这个帖子中提出理想的解决方案.对我来说,这比其他人"不理想".没有脚本,没有错误,没有TTY问题,没有与其他ssh命令的错误交互,没有无限循环的可能性,没有文件编辑,不需要额外的包.

推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有