Shell-Script
startx 不一致的行為
我有一個 SSH 伺服器,負責
dwm
通過 X 轉發執行二進製文件,在我的客戶端電腦上,我有一個 shell 腳本來替換上面的dwm
二進製文件/usr/local/bin
,在該腳本內,我只需呼叫伺服器請求它執行原始文件dwm
:ssh -q -tt user@172.17.0.2 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
這裡的原因是為了限制執行除一組 Docker 容器初始化腳本(位於)
ForceCommand
之外的任何東西的可能性/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)
終於設法找到了解決方案,出於某種原因,問題在於我是:
- 強制 TTY 分配,必須
-tt
從 SSH 客戶端刪除標誌- 請求 Docker 分配一個偽 tty 並以互動模式執行,必須
-it
從 SSH 伺服器端的 Docker CLI 中刪除標誌以上幾點僅適用於圖形應用程序,例如
st
andfirefox
,互動式容器,但不是圖形(fish
shell 和neovim
)仍然需要上述兩個標誌,-tt
在 SSH 客戶端和-t
Docker CLI 上