Shell-Script

startx 不一致的行為

  • April 13, 2022

我有一個 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

這是其中一個腳本的範例,下面的一個執行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)

終於設法找到了解決方案,出於某種原因,問題在於我是:

  • 強制 TTY 分配,必須-tt從 SSH 客戶端刪除標誌
  • 請求 Docker 分配一個偽 tty 並以互動模式執行,必須-it從 SSH 伺服器端的 Docker CLI 中刪除標誌

以上幾點僅適用於圖形應用程序,例如stand firefox,互動式容器,但不是圖形(fishshell 和neovim)仍然需要上述兩個標誌,-tt在 SSH 客戶端和-tDocker CLI 上

引用自:https://unix.stackexchange.com/questions/697379