我希望能够通过桌面上的单个ssh命令在远程服务器上启动屏幕会话。但是,屏幕似乎需要一个终端,通过ssh运行命令时该终端不可用。

所以很明显

一个示例)不起作用,并给出了

ssh root@my.machine screen "tail -f /var/log/messages"


我希望ssh在屏幕下启动该命令,以便稍后登录并像我将其附加到屏幕一样会议本来可以手动启动的。

评论

顺便说一句,您可以通过错误使用屏幕来解决此错误。我有一个shell函数正在执行exec

#1 楼

尝试对-s选项使用ssh

ssh -t root@my.machine screen "tail -f /var/log/messages"


从man ssh

-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.


评论


我正在尝试使用tmux ssh -t user @ machine tmux attach进行相同操作,我可以附加一个远程tmux会话,但它会干扰字符编码。它仅显示ascii字符。有解决办法吗?

– Macario
2012年7月31日在8:22



@Macario您可能想为此打开一个单独的问题,尽管在使用ssh -t运行它时与它有切向关系,但听起来更像是与将LC_ *设置为以交互方式运行或以非交互方式运行不同。当您将命令行传递给ssh执行时,它将在非交互式环境中执行。也有可能是在非交互式执行时缺少传递TERM环境变量的情况,在这种情况下,tmux将不知道您的终端实际上​​具有什么功能,并退回到最小公分母。

– Kjetil Joergensen
2012年8月1日0:34



我没有使用ssh,但面临相同的问题。请帮忙。 serverfault.com/questions/861632/无法在屏幕上运行代码

–张锦州
17年7月11日在21:23

#2 楼

您可以使用:

ssh root@host screen -m -d "tail -f /var/log/messages"


这将启动一个分离的屏幕,并在其上运行命令。

   -m   causes screen  to  ignore  the  $STY  environment  variable.  With
        "screen  -m"  creation  of  a  new session is enforced, regardless
        whether screen is called from within  another  screen  session  or
        not.  This  flag has a special meaning in connection with the `-d'
        option:

   -d -m   Start screen in "detached" mode. This creates a new session but
           doesn't  attach  to  it.  This  is  useful  for  system startup
           scripts.


评论


您的回答同样好,太差了,我必须选择。也许有人应该编辑第一个答案并添加您的信息。

– Thomas Vander Stichele
09年9月9日13:57

这个答案更好,因为它确实可以分离,因此可以让您继续在此终端上工作(并可以从任何其他位置附加到屏幕会话)。

–俄罗斯
20年8月6日在19:07

#3 楼

较晚的答案,但这是我的工作,我为此做了一个别名(叫它t):

,并告诉ssh附加到正在运行的会话,如果需要的话,开始一个新会话,使用screen作为Breakout命令,使用UTF-8,并对终端机保持警惕。打开一个终端,键入^Z,它将在$ MYSERVER上打开我的屏幕会话。然后,我可以打开另一个终端,执行相同的操作,然后我获得另一个窗口进入同一会话。标签同时显示。

评论


我通读了好几页,但并没有完全回答我的要求,但您确实做到了。我假设屏幕或tmux这些天可能在大多数服务器上,并且我连接的服务器可能只是暂时的,所以我不想像大多数答案所建议的那样与bashrc混在一起。您也可以在外壳程序中使其成为函数,并接受$ host和$ command之类的参数(将在末尾放置它们)。您可以将其与ssh_config中的主机名结合起来,而不是将别名硬编码为t作为单个主机。

–dragon788
17年6月16日23:40

@ dragon788确实,我现在使其成为一个函数,并用“ $ @”替换了$ MYSERVER。我仍然经常使用这个。

– w00t
17年6月17日在5:19

#4 楼

通过将以下内容放入服务器上的〜/ .bashrc文件中,它将在我首次登录服务器时启动一个屏幕会话,或者如果已经运行,则将其重新连接到该会话。

我觉得很方便:

if [ -n "$SSH_CONNECTION" ] && [ -z "$SCREEN_EXIST" ]; then
    export SCREEN_EXIST=1
    screen -DRi
fi


评论


我尝试了这个,但是当我执行屏幕-ls时,我看不到任何屏幕会话

–塔伦
15-10-23在10:29