我有一个 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)
答案1
最终设法找到解决方案,出于某种原因,问题在于我是:
- 强制 TTY 分配,必须
-tt
从 SSH 客户端删除标志 - 请求 Docker 分配伪 tty 并以交互模式运行,必须
-it
从 SSH 服务器端的 Docker CLI 中删除标志
上述几点仅适用于图形应用程序,例如
st
和firefox
,交互式容器,但不是图形化的(fish
shell 和neovim
)仍然需要上面的两个标志,-tt
在 SSH 客户端和-t
Docker CLI 上