WindowsでVSCode・CursorからGUIアプリケーションを起動する方法

WindowsでVSCodeやCursorを使用している際に、SSH経由でリモートサーバのGUIアプリケーションを起動する方法について説明します。

発生する問題

リモートサーバでGUIアプリケーションを実行しようとすると、以下のようなエラーが発生します:

xeyesの場合

Error: Can't open display:

geeqieの場合

Can't initialize clutter-gtk.
Start Geeqie with the option "geeqie --disable-clutter"

手っ取り早い解決方法

お急ぎの方は以下の2つの手順で解決できます:

1. SSH設定の追加

Windows側のSSH configファイルに以下を追加:

ForwardX11 yes
ForwardX11Trusted yes

2. VcXsrvのインストール

VcXsrv公式サイトからダウンロードして起動

これでGUIアプリケーションが使用できるようになります。

導入

メインPCがWindowsの私は研究作業は基本的にWSLを使っています。内容はssh等がメインですが…

この記事はデュアルブートにするほどのスペックがない、mac買うお金がない、2台持ちにするお金がない学生である著者が、同士に向けて書いています。powerpointの作業も手元にしたいし、Virtualboxでwindows作業は遅いし…で何かと迷うとこではありますね。

wslからsshでリモートサーバにつないだ際にはssh に -Xをつけることでx11-sererが起動しDISPLAYを手元に表示してくれる機能があります。(WSLは若干動画怪しいですが…)

しかし、powershellやコマンドプロンプトではそこがうまくいきません(ssh -XYだといいとかあるけど筆者はうまくいかなかった)

それだけであれば、だからなんだ、powershellなんて普段はほとんど使わんからええよ、と思うかもしれません。

しかしVScodeやcursorは基本的にwindows側にインストールされます。故にこうしたエディタにremote-sshの拡張機能を入れている場合、エディタでsshする際に参照されるのはpowershell側のsshの設定になります。(configもwindows側を参照する)

そのためこうしたエディタでsshするとGUI機能が使えない!となるわけです。

私が調べたサイトでは別途powershllでsshしつつDISPLAY環境変数をexportすればいい!とか書いてたけどこれは面倒すぎるので解決策が見つかったので書いておきます。(個人的にはエディタにターミナルがあるのでそこで完結するべきという思想があります。逆に編集作業を伴わないならwslからsshでいいし簡単な編集なら直接vimでいいよねという思想。)

詳細な解決手順

1. SSH設定ファイルの編集

Windows側のSSH configファイル(通常は ~/.ssh/config)に以下の設定を追加:

Host {接続名}
    User {ユーザー名}
    HostName {ホスト名}
    ProxyCommand ssh.exe server -W %h:%p
    ForwardAgent yes
    ForwardX11 yes
    ForwardX11Trusted yes
    ForwardX11Timeout 1h
    ServerAliveInterval 300
    ServerAliveCountMax 5

2. VcXsrvのインストールと設定

ダウンロード

VcXsrv公式サイトからダウンロード

VcXsrvダウンロードページ

インストール後の起動

デスクトップに「XLaunch」アイコンが作成されます:

XLaunchアイコン

設定手順

以下の画面で設定を進めます:

XLaunch設定1

XLaunch設定2

XLaunch設定3

3. (おすすめ)windowsのスタートアップに入れておく

毎回つながなくてもPC起動時に起動してくれます(常駐アプリ)

Windowsスタートアップ設定

4. cursorでsshし、リモートサーバでコードを編集しつつターミナルでxeyesを出してみた

xeyes実行結果

かわいい。

他の記事も読む

CursorでTimeout発生時の解決策
cursor timeout troubleshooting
cursorでmarkdownの拡張機能を入れてるのに画像をpasteできない
cursor markdown 画像