我有一个 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
)之外的任何其他东西的可能性
这是其中一个脚本的示例,下面的一个运行dwm
Docker 映像:
#!/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)
终于设法找到了解决方案,出于某种原因,问题在于我是:
-tt
从 SSH 客户端删除标志-it
从 SSH 服务器端的 Docker CLI 中删除标志