sshの-R(-L)オプションはポートを転送するのにもっぱら使うものだと思うのだけれど、unixドメインソケットをそのまま転送できるという話*1を聞いたので試してみた。ssh -X localhost
などの手間がなくて良いので多少便利。
ssh -R /tmp/.X11-unix/X0:/tmp/.X11-unix/X0 ${ACCOUNT}@${ADDRESS}
以下は雑記です。
認証ゆるゆるの実験用Podman (Docker)サーバーのDockerfileなど
RUNコマンドをワンライナーで書くのは手がつらいので、いけていないのは無視してシェルスクリプトに全部書きます。
これが使えるようになるのを願っています。Heredocs が Dockerfile で使えるようになって \ && で繋がなくてよくなる🙌
— Tori Hara (@toricls) 2021年7月31日
/ "Introduction to heredocs in Dockerfiles - Docker Blog" https://t.co/8zd4gkIYv3 pic.twitter.com/OlImC0NaZ2
# 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 の順に叩きます。