scripting - 完全透明且自动地使用 GNU Screen

标签 scripting automation ssh gnu-screen

screen 当然很棒,但我不想考虑它。我经常通过 ssh 连接到一台机器,开始做一堆事情,然后想“天哪,我希望我在做这一切之前考虑过启动一个 screen session ,这样我以后就可以从家里重新连接到它”。

我希望每当我登录计算机时 screen 都会自动启动。 当我断开连接时,我希望能够立即简单地重新连接,而不必担心“screen -ls”和“screen -dr”。

我有一个脚本,可以实现该问题的一个解决方案,我将其作为答案发布。我有兴趣了解其他方法。

最佳答案

使用以下内容,ssc,而不是ssh。如果您只是执行“ssc remote.com”,那么它将列出现有的 screen session 。给它第三个参数,它将连接到该 screen session ,或者创建它并连接到它。无论哪种方式,如果您断开连接,您只需在 shell 中执行“向上箭头,输入”即可重新连接。 screen 零知识! 编辑:感谢 @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 session 退出并返回本地终端提示符:
https://superuser.com/questions/147873/ssh-sessions-in-xterms-freeze-for-many-minutes-whenever-they-disconnect

关于scripting - 完全透明且自动地使用 GNU Screen,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1075947/

相关文章:

algorithm - 使用受限功能语言对并行数组进行排序的最有效方法

windows - 批量字符转义

internet-explorer - 使用 Powershell 自动化 IE 确认提示

testing - OpenTest 自定义测试参与者

bash - 捕获期望的 ssh 输出到变量

linux - 使用 bash 在文件中的模式后面插入一行

scripting - 从批处理中调用 PowerShell,并检索脚本中设置的临时环境变量的新值?

python - 如何使用 perl 将控制权传递给不同的终端选项卡?

ruby-on-rails - Rails Rake和mysql ssh端口转发

windows - 从 Windows 命令提示符使用 ssh