增加:这个问题是现在,我相信,通过这一个所包含的:   利用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

这似乎在我的安装工作。

其他提示

利用GNU屏幕完全透明和自动 <:

这现在是由该所包含的/ 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屏幕名

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top