屏幕-R不工作与SSH

我在办公室里有一个linux box,我想在家里从我的Macbook ssh进入。 我无法直接到达端口22的盒子,但我有一个端口隧道钉在本地主机:23001和远程Linux机箱上的端口22之间。 这适用于正常的ssh会话:

$ ssh -t -2 -A -p 23001 [email protected] 

下一步是,我想在屏幕会话内自动运行我的terminal会话。 它几乎可以做到:

 $ ssh -t -2 -A -p 23001 [email protected] screen -R 

如果我没有当前的屏幕会话,它创build一个。 如果已经有一个分离的屏幕,它连接到它。 到现在为止还挺好。 但是,问题是,我从来没有得到一个loginshell,所以我的.profile永远不会运行,我的环境不能设置。 于是,我又走了一步,试着:

 $ ssh -t -2 -A -p 23001 [email protected] bash -l -c screen -R 

现在,我得到一个运行.profile的真实loginshell,但屏幕无法重新连接到分离的会话。 我在我的Macbook上运行上面的命令,在远程机器上,我有一个附加的屏幕:

 $ screen -list There is a screen on: 21117.pts-21.roysmith01 (01/19/2015 01:50:59 PM) (Attached) 1 Socket in /var/run/screen/S-roysmith. 

如果我closures了我运行上面的ssh行的窗口,会话被分离,如预期的那样:

 $ screen -list There is a screen on: 21117.pts-21.roysmith01 (01/19/2015 01:50:59 PM) (Detached) 1 Socket in /var/run/screen/S-roysmith. 

现在,如果我打开另一个本地terminal窗口并再次运行该ssh命令,屏幕无法find分离的会话并创build一个新的:

 $ screen -list There are screens on: 21304.pts-21.roysmith01 (01/19/2015 01:52:40 PM) (Attached) 21117.pts-21.roysmith01 (01/19/2015 01:50:59 PM) (Detached) 2 Sockets in /var/run/screen/S-roysmith. 

任何想法发生了什么? 为什么插入一个loginshell让屏幕不能find现有的会话呢?

如果没有现有的会话连接,屏幕将使用-R标志给出的任何命令。 所以这应该做你想要的(而不必触摸.screenrc):

 $ ssh [...]@127.0.0.1 screen -R bash -l 

(这当然是最简单的方法来完成你原先设定的工作。)

但是既然你问了,我还要提一下为什么你的bash -l方法不起作用。 这是如此接近!

bash -c只接受下一个参数作为命令。 之后的论点进入$0$1

 $ bash -c echo bar [just a blank line] $ bash -c 'echo foo' foo $ bash -c 'echo $1' foo bar baz bar 

这就是你想要的bash -l -c screen -R要做的事情:

 $ ssh [...]@127.0.0.1 bash -l -c "'screen -R'" 

是的,令人兴奋的是,你确实需要两个级别的引用才能工作:外部引号告诉你的本地shell保留内部引号,并且需要内部引号,因为ssh发送结果命令bash -l -c 'screen -R' ,作为一个有四个空格的string,而不是四个单词的列表。 用一级引用,远程shell仍然会看到bash -l -c screen -R

这也可以,远程shell被赋予命令stringbash -l -c screen\ -R

 $ ssh [...]@127.0.0.1 bash -l -c 'screen\ -R' 

或者,给远程shell bash -l -c "screen -R"

 $ ssh [...]@127.0.0.1 bash -l -c \"screen -R\" 

我发现如何让屏幕performance得像一个标准的bash shell? ,这指出了我正确的方向。 把“defshell -bash”放在我的.screenrc中,就是我想要的行为。 我可以弄清楚什么样的屏幕真的在做什么,但是。 我讨厌find没有理解原因的事情。