startx が一貫して動作しません。

startx が一貫して動作しません。

X転送を通じてバイナリの実行を担当するSSHサーバーがあり、私のクライアントコンピュータには、次のバイナリをdwm置き換えるシェルスクリプトがあります。dwm/usr/local/bindwm

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

1つだけ、-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

その理由は、ForceCommandDockerコンテナ初期化スクリプトセット(場所/usr/local/bin

dwm以下は、Dockerイメージを実行するスクリプトの1つの例です。

#!/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クッキー)

私の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

実際のスクリプトを実行するためにSSHサーバーに要求するパラメータstartxとして渡されたスクリプトを実行しようとするたびに、黒い画面が表示され、何も起こらず、以下の例のようにそのまま残ります。dwmdwm

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

しかし、シェルコマンドの置き換えとシェルのnoop演算子を使用して少し異なる上記の同じコマンドを実行すると、正常に動作します(表示に通常よりdwm数秒かかることがあります。おそらく醜いハッキングのため)

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

答え1

ついに解決策を見つけました。何らかの理由で問題は次のとおりです。

  • TTY割り当てを強制するには、-ttSSHクライアントからフラグを削除する必要があります。
  • Dockerにpseudo-ttyを割り当てて対話型モードで実行するように要求するには、-itSSHサーバー側のDocker CLIからフラグを削除する必要があります。

上記はインタラクティブコンテナなどのグラフィックアプリケーションにのみ適用されますが、グラフィックでstfirefoxないアプリケーション(fishshellと)にはSSHクライアントとDocker CLIのneovim両方で上記の2つのフラグが必要です。-tt-t

関連情報