startx 行为不一致

startx 行为不一致

我有一个 SSH 服务器,负责dwm通过 X 转发运行二进制文件,在我的客户端计算机上,我有一个 shell 脚本来替换dwm上的二进制文件/usr/local/bin,在该脚本内,我只需调用服务器,请求它运行原始文件dwm

ssh -q -tt [email protected] dwm $@

只有一个-t,我收到以下错误:

Pseudo-terminal will not be allocated because stdin is not a terminal

在 SSH 服务器端,我使用脚本ForceCommand传递接收到的参数container_runner,如下所示:

#!/bin/sh
/usr/local/bin/$SSH_ORIGINAL_COMMAND

这样做的原因ForceCommand是为了限制运行一组 Docker 容器初始化脚本(位于/usr/local/bin)之外的任何其他内容的可能性

以下是其中一个脚本的示例,下面的脚本运行dwmDocker 映像:

#!/bin/sh
docker run \
    --pull=never \
    --rm \
    -v container-scripts:/container-scripts \
    -v ssh-keys:/home/dwm/.ssh \
    -v x11-shared:/tmp/.X11-unix \
    -it \
    -e DISPLAY=:1 \
    -e XAUTHORITY=/tmp/.X11-unix/container-cookie \
    dwm \
    $@ 2>/dev/null
  • container-scripts- 包含一组脚本的卷,允许在容器内运行其他同级容器
  • ssh-keys- SSH 密钥,以便能够从其他容器内部运行容器
  • x11-shared- X11共享数据(X11套接字和xauth cookie)

我的ssh_config看起来像这样:

StrictHostKeyChecking no
UserKnownHostsFile /dev/null
ForwardX11 yes
ForwardX11Trusted yes
PreferredAuthentications=publickey

在我从我的 禁用 SSH 多路复用后,事情开始变得不一致ssh_config,之前使用下面的设置,它一直工作正常(这没有意义,据我所知,SSH 多路复用不应干扰这一点),设置如下:

ControlPath /tmp/%r@%h:%p
ControlMaster auto
ControlPersist yes

发生的情况是,每当我尝试运行startx作为参数传递的脚本,该dwm脚本向 SSH 服务器发出请求来运行实际的dwm,我只是得到一个黑屏,什么也没有发生,它只是保持这样,示例如下:

startx /usr/local/bin/dwm -- :1

但是,如果我运行上面相同的命令,稍有不同,使用 shell 命令替换和 shell noop 操作符,它就可以正常工作(只是dwm比平时多花几秒钟的时间来显示,可能是由于丑陋的黑客行为)

: $(startx /usr/local/bin/dwm -- :1)

答案1

最终设法找到解决方案,出于某种原因,问题在于我是:

  • 强制 TTY 分配,必须-tt从 SSH 客户端删除标志
  • 请求 Docker 分配伪 tty 并以交互模式运行,必须-it从 SSH 服务器端的 Docker CLI 中删除标志

上述几点仅适用于图形应用程序,例如stfirefox,交互式容器,但不是图形化的(fishshell 和neovim)仍然需要上面的两个标志,-tt在 SSH 客户端和-tDocker CLI 上

相关内容