WSL2でXサーバーを動かす際に、localhostの問題に加えて、Windwows defnder Filrewallの設定が必要でした。以下、作業メモです。
clip.exeを使えばよいことが判明。なんだかなとも思うけど、まぁ良いか。
ls | clip.exe
そもそもの目的
PDFをDeepLで翻訳したいときに、PDFのデータが行ごとで分割されていて、そのままでは翻訳がかけられないので、文として成り立つように行を連結する簡単なプログラムを作った。Windows上の特定のテキストファイルに保存し、WSLでコマンドを実行することでWSL上に連結した文書が表示されるので、これをコピーしてDeepLにかければ、良い感じの翻訳ができる。
しかし、だんだんWSLでのコピーが面倒になってきた。プログラムの中で、クリップボードにコピーできないかと調べてみると、xselというプログラムを使ってコピーができるようだ。
xselのインストール
以下のページなどを参考に xselとXサーバーをインストールする。
今になって気付いたが、XのコマンドだからXサーバーをインストールする必要があるのね。
Error: Can't open display
実行してみると、"Error: Can't open display"などのエラーになってしまう。調べてみると、WSL2になった際に、WSLのネットワークが Hyper-Vを使ってWindows10とは別のネットワークになったことが原因らしい。
そうか、このIPアドレスを使えばよいのか。
$ cat /etc/resolv.conf | grep nameserver | awk '{print $2}'
172.29.96.1
早速、IPアドレスを指定して接続してみるが、タイムアウトしてしまう。これは、ネットワークがつながっていないのではないかと、直接 telnetで叩いてみるとやはりタイムアウト。
telnet 172.29.96.1 6000
どういうネットワークになっているんだろうと調べたところ、こちらのページに詳しく述べられていました。
Windows defender firewallの設定
上記情報参考に、Windows側でネットワークを見てみると、WSLが使用する vEnthernet(WSL)は"プライベートネットワーク"になっていない。
それではと、Windows Defnder Firewallの"受信の規則"を見ると、VcXsvのTCPとUDPにブロックルールが書かれている。(残骸として残っているXmingが動かなかったのも、同じ理由だった模様)
ブロックしている二つのルールを"接続をブロックする"から"接続を許可する"に変更して適用。
$ telnet 172.29.96.1 6000
Trying 172.29.96.1...
Connected to 172.29.96.1.
Escape character is '^]'.
^]
telnet> quit
Connection closed.
これにより無事に、Xサーバーと通信ができるようになりました。
$ echo "Hello world!" | xsel -bi
Hello world!
調べる中で参考になったサイトなど