ねののお庭。

かりかりもふもふ。

Windowsでputtyを使わずにX11 Forwardingをする。

リモートサーバで3Dモデルの可視化~やらなんやらしたのを手元のwindowsマシンでも確認したい。

3Dモデル単体とかならThree.jsとか叩いてブラウザで見たりしてもいいのだけど(実際昔はそうした)、描画したいものが複雑だったり、OSSに乗っかってしまいたかったりすると(こっちのモチベーションが高い)、ブラウザとか介さずにGUIで可視化したいわけです。楽だしね。

なのでX Window Systemに乗っかりましょう、ということになるわけですが...。

ググるとputty使った方法とかいっぱい書かれているんですが、puttyとか使いたくはないわけです。 何故ならwindowsに標準でssh乗っかってるから。

やり方としては2つあって

  • power shellからsshする。
  • WSL2からsshする。

で、当然前者でいいじゃんとか思うわけだけど、バグとか踏んだのでメモっておきます。

なおリモートサーバ側の設定とかは割愛します。Windowsでどうすんねん、という話がしたいので。

準備

VcXsrv Windows X Serverをダウンロード/起動しておきます。 特に変わったことはしない。

sourceforge.net

power shellからsshする。

まずDISPLAY変数を設定しないといけないので、power shellで以下のように設定します。

$env:DISPLAY="localhost:0.0"

で、リモートサーバのSSH先がremoteだったとします。 この時、

ssh -X remote 

とか打てばX11 forwardingしてくれるでしょ~とか思うんですが、してくれません。 かわりに、こうしましょう。

ssh -Y remote 
xeyes

こうするとちゃんと動作します。

-X-Yは何が違うの~というとTrustedかどうか。-XはTrusted。-YはUnTrusted。

これについては以下のようなissueが報告されています。 ナチュラルにバグっぽいので、早々に修正されることを期待したいですね...!

github.com

WSL2からsshする。

WSL2のインストールは以下を参考にしてください。

docs.microsoft.com

WSLでの設定で重要なのはDISPALY変数をどうやって設定するかで、power shellと同様にlocalhost:0.0とかしてもダメです(でした)。

以下の3つのどれかを.bashrcとかに一行書いてDISPLAY変数を設定しておきましょう。設定した後source .bashrcを忘れないように。

export DISPLAY="`grep nameserver /etc/resolv.conf | sed 's/nameserver //'`:0"

export DISPLAY="`sed -n 's/nameserver //p' /etc/resolv.conf`:0"

export DISPLAY=$(ip route|awk '/^default/{print $3}'):0.0

その後、以下のコマンドを打ってGUIが起動すれば正しく設定されています。

sudo apt install x11-apps
xeyes

設定がちゃんとできていることが確認できたら、ssh -Xしてxeyesなどを起動してみてください。

ssh -X remote
xeyes

WSLの場合については以下のmicrosoftのブログが非常に有益です。 techcommunity.microsoft.com

まとめ

power shellで設定する場合は(現状では)-Xではなく-Yを使う。

$env:DISPLAY="localhost:0.0"
ssh -Y remote 

WSLを使う場合はDISPLAY変数をlocalhostで設定せずに、以下のどれかを使って設定する。

export DISPLAY="`grep nameserver /etc/resolv.conf | sed 's/nameserver //'`:0"

export DISPLAY="`sed -n 's/nameserver //p' /etc/resolv.conf`:0"

export DISPLAY=$(ip route|awk '/^default/{print $3}'):0.0

# WSLの場合は-XでOK
ssh -X remote

バグが取れるまではTrustedがいいかどうかでどっち使うか分かれそうですね。