Tenho um servidor SSH que é responsável por executar o dwm
binário através do encaminhamento X, no meu computador cliente, tenho um shell script que substitui o dwm
binário em /usr/local/bin
, dentro desse script, basta fazer uma chamada para o servidor solicitando que execute o original dwm
:
ssh -q -tt [email protected] dwm $@
Com apenas um single -t
, recebo o seguinte erro:
Pseudo-terminal will not be allocated because stdin is not a terminal
No lado do servidor SSH, estou usando ForceCommand
para passar os parâmetros recebidos através de um container_runner
script, fica assim:
#!/bin/sh
/usr/local/bin/$SSH_ORIGINAL_COMMAND
A razão para o ForceCommand
aqui é limitar a possibilidade de executar qualquer outra coisa além de um conjunto de scripts de inicialização de contêiner do Docker (localizado em /usr/local/bin
)
Aqui está um exemplo de um desses scripts, o abaixo executa a dwm
imagem do 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
- volume contendo um conjunto de scripts que permitirá a execução de outros containers irmãos dentro de containersssh-keys
- as chaves SSH para poder executar contêineres de dentro de outros contêineresx11-shared
- Dados compartilhados X11 (soquete X11 e cookie xauth)
O meu ssh_config
fica assim:
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
ForwardX11 yes
ForwardX11Trusted yes
PreferredAuthentications=publickey
As coisas começaram a ficar inconsistentes depois que eu desabilitei a multiplexação SSH do meu ssh_config
, anteriormente com as configurações abaixo, funcionou bem o tempo todo (o que não faz sentido, até onde eu sei, a multiplexação SSH não deve interferir nisso), configurações abaixo:
ControlPath /tmp/%r@%h:%p
ControlMaster auto
ControlPersist yes
O que acontece é que sempre que tento rodar startx
passando como argumento meu dwm
script que faz uma requisição ao servidor SSH para rodar o real dwm
, só recebo uma tela preta, e nada acontece, fica assim, exemplo abaixo:
startx /usr/local/bin/dwm -- :1
Mas, se eu executar o mesmo comando acima, um pouco diferente, usando a substituição do comando shell junto com o operador shell noop, ele funciona bem (leva apenas mais alguns segundos para mostrar dwm
do que o normal, provavelmente devido ao hack feio)
: $(startx /usr/local/bin/dwm -- :1)
Finalmente consegui encontrar uma solução para isso, por algum motivo, o problema estava no fato de eu estar:
-tt
sinalizador do cliente SSH-it
sinalizadores da CLI do Docker no lado do servidor SSH