X転送を通じてバイナリの実行を担当するSSHサーバーがあり、私のクライアントコンピュータには、次のバイナリをdwm
置き換えるシェルスクリプトがあります。dwm
/usr/local/bin
dwm
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
その理由は、ForceCommand
Dockerコンテナ初期化スクリプトセット(場所/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
として渡されたスクリプトを実行しようとするたびに、黒い画面が表示され、何も起こらず、以下の例のようにそのまま残ります。dwm
dwm
startx /usr/local/bin/dwm -- :1
しかし、シェルコマンドの置き換えとシェルのnoop演算子を使用して少し異なる上記の同じコマンドを実行すると、正常に動作します(表示に通常よりdwm
数秒かかることがあります。おそらく醜いハッキングのため)
: $(startx /usr/local/bin/dwm -- :1)
答え1
ついに解決策を見つけました。何らかの理由で問題は次のとおりです。
- TTY割り当てを強制するには、
-tt
SSHクライアントからフラグを削除する必要があります。 - Dockerにpseudo-ttyを割り当てて対話型モードで実行するように要求するには、
-it
SSHサーバー側のDocker CLIからフラグを削除する必要があります。
上記はインタラクティブコンテナなどのグラフィックアプリケーションにのみ適用されますが、グラフィックで
st
はfirefox
ないアプリケーション(fish
shellと)にはSSHクライアントとDocker CLIのneovim
両方で上記の2つのフラグが必要です。-tt
-t