X 전달을 통해 바이너리 실행을 담당하는 SSH 서버가 있고 내 클라이언트 컴퓨터에는 다음의 바이너리를 dwm
대체하는 쉘 스크립트가 있습니다 .dwm
/usr/local/bin
dwm
ssh -q -tt [email protected] 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
그 이유는 ForceCommand
Docker 컨테이너 초기화 스크립트 세트(위치 /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 쿠키)
내 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 CLIneovim
모두에서 여전히 위의 두 플래그가 필요합니다.-tt
-t