如何通过台式机上的远程服务器上的ssh命令启动屏幕会话?


57

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

所以很明显

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

(例如)不起作用,并给出

Must be connected to a terminal.

我希望ssh在屏幕下启动该命令,以便稍后登录并像我手动启动的屏幕会话一样附加。


顺便说一句,您可以通过错误使用屏幕来解决此错误。我有一个shell函数正在执行exec <foo以从文件读取。后来,我在一个大脚本中尝试启动屏幕。以下所有方法。失败了,因为真正的罪魁祸首是高管。一个要牢记。检查您是否没有无意中杀死了自己的标准输入。
尼尔·麦吉尔

Answers:


77

尝试使用-t选项来ssh

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

来自man ssh

-t强制伪tty分配。这可以用来执行arbi-
        远程计算机上基于屏幕的程序,可以是
        非常有用,例如在实现菜单服务时。倍数
        选项强制tty分配,即使ssh没有本地tty。

我正在尝试与tmux相同,ssh -t user@machine tmux attach我可以附加一个远程tmux会话,但它会混淆字符编码。它仅显示ascii字符。有解决办法吗?
Macario

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

我没有使用ssh,但面临相同的问题。请帮忙。serverfault.com/questions/861632/
无法

32

您可以使用:

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.

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

8

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

ssh $MYSERVER -a -x -t screen -xRR -A -e^Zz -U -O

这告诉ssh禁用代理和X11转发,并告诉screen附加到正在运行的会话,如果需要,则启动一个新会话,^Z用作Breakout命令,使用UTF-8,并对终端机保持警惕。

所有这些意味着我可以打开一个终端,键入t,它将在$ MYSERVER上打开我的屏幕会话。然后,我可以打开另一个终端,执行相同的操作,然后获得另一个进入同一会话的窗口。

在同一个屏幕会话中有多个终端窗口真是太好了,因此您可以同时查看两个屏幕选项卡。


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

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

4

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

我觉得这非常方便:

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

我尝试了此操作,但是当我这样做时,我screen -ls没有看到任何屏幕显示
Tarun
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.