tak0kadaの何でもノート

発声練習、生存確認用。

医学関連は 医学ノート

X11ソケットを明にTCPに変換せずにSSHで転送する

sshの-R(-L)オプションはポートを転送するのにもっぱら使うものだと思うのだけれど、unixドメインソケットをそのまま転送できるという話*1を聞いたので試してみた。ssh -X localhost などの手間がなくて良いので多少便利。

ssh -R /tmp/.X11-unix/X0:/tmp/.X11-unix/X0 ${ACCOUNT}@${ADDRESS}

以下は雑記です。

認証ゆるゆるの実験用Podman (Docker)サーバーのDockerfileなど

RUNコマンドをワンライナーで書くのは手がつらいので、いけていないのは無視してシェルスクリプトに全部書きます。

これが使えるようになるのを願っています。

# Dockerfile
FROM ubuntu:latest
ENV DEBIAN_FRONTEND=noninteractive
ENV LANG C.UTF-8
ENV LC_ALL C.UTF-8

COPY build.sh /tmp/build.sh
RUN bash /tmp/build.sh
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]

ssh接続を切った後にソケット用のファイルが残るのでtrapで削除するコードをbashrcに仕込むことにしました。

# build.sh
#!/usr/bin/bash

apt-get update
apt-get -qq install -y \
    openssh-server \
    xserver-xorg-core \
    x11-apps

apt-get clean
rm -rf /var/lib/apt/lists/*

mkdir /var/run/sshd
# login to root without password
passwd -d root
sed -i'' -e's/^#PermitRootLogin prohibit-password$/PermitRootLogin yes/' /etc/ssh/sshd_config
sed -i'' -e's/^#PasswordAuthentication yes$/PasswordAuthentication yes/' /etc/ssh/sshd_config
sed -i'' -e's/^#PermitEmptyPasswords no$/PermitEmptyPasswords yes/' /etc/ssh/sshd_config
sed -i'' -e's/^UsePAM yes/UsePAM no/' /etc/ssh/sshd_config
# allow TCP fowarding
sed -i 's/#AllowTcpForwarding yes/AllowTcpForwarding yes/g' /etc/ssh/sshd_config
# fix x11 offset
sed -i 's/#X11DisplayOffset 10/X11DisplayOffset 10/g' /etc/ssh/sshd_config

touch ~/.Xauthority
mkdir /tmp/.X11-unix
cat <<- EOF >> ~/.bashrc
    export DISPLAY=:0
    trap 'rm /tmp/.X11-unix/X0; exit' exit
EOF

ビルドや実際に使うときのコマンドなど

色々の手続きは覚えられないのでMakefileに書きました。Xauth cookieを転送しないと仮想マシン上のXアプリケーションを描画できないのでよしなに転送します。podmanを使っているのはrootless dockerの代用に便利という話を教えてもらったからです。

# Makefile
.PHONY: help
help:
    cat Makefile

.PHONY: install
install:
    podman build . -t x11-unix-socket-forward-example
    sed -i '/^\[127.0.0.1\].*$$/d' ~/.ssh/known_hosts

.PHONY: run
run:
    podman run -p 10022:22 \
               --name tmp-x11-unix-socket-forward-example \
               -d --rm x11-unix-socket-forward-example

.PHONY: ssh/forward-unix-socket
ssh/forward-unix-socket:
    xauth list | head -n1 | awk '{print $$2,$$3}' | xargs -I {} \
        ssh -p 10022 root@127.0.0.1 'xauth add unix:0 {}'
    ssh -p 10022 \
        -R /tmp/.X11-unix/X0:/tmp/.X11-unix/X0 \
        root@127.0.0.1

.PHONY: stop
stop:
    podman container stop tmp-x11-unix-socket-forward-example

.PHONY: clean
clean:
    podman image rm x11-unix-socket-forward-example
    sed -i '/^\[127.0.0.1.\]*$$/d' ~/.ssh/known_hosts

make install -> run -> ssh/foward-unix-socket -> stop -> clean の順に叩きます。