0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

WSL の認証で ChatGPT が勝手に開くので、Windows のブラウザをデフォルトにした

0
Posted at

はじめに

WSL Ubuntu 内にブラウザ機能を内蔵した ChatGPT Desktop アプリをインストールしたところ、今回の環境では HTTP・HTTPS のデフォルトアプリが chatgpt.desktop に変わっていました。

その結果、gh auth login や claude auth login でブラウザ認証を行おうとすると、普段使っているブラウザではなく、ChatGPT 内のブラウザが起動するようになりました。

認証用のページを開きたいだけなのに、別のアプリが立ち上がるのは少々不便です。最初は ChatGPT アプリをアンインストールして回避していましたが、そのたびに削除するのも面倒なので、WSL 側のブラウザ設定を見直すことにしました。

この記事では、WSL Ubuntu から開く HTTP・HTTPS の URL を、Windows 側のデフォルトブラウザに渡す方法をまとめます。

設定の途中で遭遇した、rundll32.exe の実行権限エラーや、自作した .desktop ファイルがデフォルトアプリとして採用されない問題についても、実際に解決した手順を紹介します。

今回は ChatGPT Desktop がきっかけでしたが、別のブラウザやブラウザ内蔵アプリが意図せず URL の起動先になった場合にも、同じ観点で切り分けられます。

本記事は、今回の環境で確認した挙動と解決手順をまとめたものです。ChatGPT Desktop のすべての配布形態・バージョンで、デフォルトブラウザ設定が変更されることを示すものではありません。

この記事でできること

  • WSL Ubuntu の HTTP・HTTPS のデフォルトアプリを確認する
  • Windows 側のデフォルトブラウザを開くランチャーを作成する
  • ランチャーを URL のデフォルトハンドラーとして登録する
  • Permission denied が出る場合に、WSL のマウント設定を確認する
  • gh auth login と claude auth login で Windows 側のブラウザが開くことを確認する

検証環境と発生した問題

今回の検証環境は次のとおりです。

項目 環境
Linux 環境 WSL Ubuntu 24.04
systemd 有効
Windows の C ドライブ /mnt/c にマウント
WSL 内のアプリ ChatGPT Desktop、複数の Linux ブラウザ
確認した認証操作 gh auth login、claude auth login

問題が起きていたとき、URL のデフォルトアプリを確認すると、次の結果になっていました。

xdg-mime query default x-scheme-handler/http
xdg-mime query default x-scheme-handler/https
chatgpt.desktop
chatgpt.desktop

この状態では、CLI が認証用 URL を開くと、ChatGPT 内のブラウザが起動してしまいます。

今回の目的は、ChatGPT 自体を削除せず、こうした URL を Windows 側の普段使っているブラウザで開くことです。

今回の設定の仕組み

次の経路で Windows のブラウザを呼び出します。

WSL 内の CLI/xdg-open
    ↓
windows-browser.desktop
    ↓
~/.local/bin/windows-browser
    ↓
Windows の rundll32.exe
    ↓
Windows 側のデフォルトブラウザ

Windows の Chrome や Edge の実行ファイルを直接指定するのではなく、Windows の URL ハンドラーを呼び出す構成にします。

作成するファイルは、次の2つです。

ファイル 役割
~/.local/bin/windows-browser Windows 側へ URL を渡すランチャー
~/.local/share/applications/windows-browser.desktop ランチャーを Linux 側のアプリとして登録するエントリ

まずこの2つを作成し、最後に HTTP・HTTPS のデフォルトアプリとして設定します。

1. 現在のデフォルトブラウザ設定を確認する

変更前の状態を確認します。

xdg-settings get default-web-browser

xdg-mime query default x-scheme-handler/http
xdg-mime query default x-scheme-handler/https

GIO 側の状態も確認します。

gio mime x-scheme-handler/http
gio mime x-scheme-handler/https

元の設定に戻せるよう、出力を控えておきます。

また、ブラウザ選択用の環境変数も確認します。

printf 'BROWSER=%s\n' "$BROWSER"
printf 'GH_BROWSER=%s\n' "$GH_BROWSER"

過去にブラウザ起動の回避策を設定した場合は、その値が残っている可能性があります。たとえば、/bin/true や別ブラウザを指定していた場合は、後で実際の CLI の動作を確認するときに注意します。

2. Windows のブラウザを開くランチャーを作る

ユーザー用のディレクトリに、ランチャースクリプトを作成します。

mkdir -p "$HOME/.local/bin"

cat > "$HOME/.local/bin/windows-browser" <<'EOF'
#!/bin/sh
exec /mnt/c/Windows/System32/rundll32.exe \
    url.dll,FileProtocolHandler "$@"
EOF

chmod 755 "$HOME/.local/bin/windows-browser"

作成したランチャーを直接実行します。

"$HOME/.local/bin/windows-browser" https://example.com

ここで Windows 側のデフォルトブラウザが開くことを確認します。

Permission denied が出た場合は、後述の「ランチャーの実行時に Permission denied が出る」を先に確認してください。

この直接実行が成功するまでは、.desktop や URL の関連付けを変更しても、起動経路全体の問題は解消しません。

3. デスクトップエントリを作成する

ランチャーを Linux 側のアプリとして登録するため、.desktop ファイルを作成します。

mkdir -p "$HOME/.local/share/applications"

cat > "$HOME/.local/share/applications/windows-browser.desktop" <<EOF
[Desktop Entry]
Type=Application
Name=Windows Default Browser
Exec=$HOME/.local/bin/windows-browser %u
Terminal=false
MimeType=x-scheme-handler/http;x-scheme-handler/https;text/html;
Categories=Network;WebBrowser;
EOF

このコマンドでは、ファイル作成時に $HOME が展開されます。

cat "$HOME/.local/share/applications/windows-browser.desktop"

今回の環境では、次の内容になりました。

[Desktop Entry]
Type=Application
Name=Windows Default Browser
Exec=/home/yuhri/.local/bin/windows-browser %u
Terminal=false
MimeType=x-scheme-handler/http;x-scheme-handler/https;text/html;
Categories=Network;WebBrowser;

%u は、起動時に渡される URL の位置を示します。

この例は、ホームディレクトリのパスに空白を含まない環境を対象としています。パスに空白を含む場合は、Exec の引用・エスケープを別途確認してください。

デスクトップエントリを検証する

必要なツールをインストールします。

sudo apt install desktop-file-utils

書式を検証し、アプリケーションの MIME データベースを更新します。

desktop-file-validate \
    "$HOME/.local/share/applications/windows-browser.desktop"

update-desktop-database "$HOME/.local/share/applications"

続けて、.desktop を経由して起動します。

gio launch \
    "$HOME/.local/share/applications/windows-browser.desktop" \
    https://example.com

ここでも Windows 側のブラウザが開くことを確認してください。

この時点で、次の2段階が動作していることになります。

  1. ランチャーから Windows 側のブラウザを開ける
  2. .desktop 経由でもランチャーを起動できる

4. HTTP・HTTPS のデフォルトアプリに設定する

今回、最終的に成功した登録方法は gio mime でした。

gio mime x-scheme-handler/http windows-browser.desktop
gio mime x-scheme-handler/https windows-browser.desktop

次のように表示されます。

Set windows-browser.desktop as the default for x-scheme-handler/http
Set windows-browser.desktop as the default for x-scheme-handler/https

設定結果を確認します。

gio mime x-scheme-handler/http
gio mime x-scheme-handler/https

HTTPS の場合、既定アプリが次のようになっていれば設定できています。

Default application for “x-scheme-handler/https”: windows-browser.desktop

xdg-mime 側からも確認します。

xdg-mime query default x-scheme-handler/http
xdg-mime query default x-scheme-handler/https

期待する出力は次のとおりです。

windows-browser.desktop
windows-browser.desktop

最後に、URL のデフォルト起動経路を確認します。

xdg-open https://example.com

Windows 側のブラウザが開けば、関連付けを含めた動作確認は完了です。

なお、ここで設定しているのは主に HTTP・HTTPS の URL ハンドラーです。ローカルの HTML ファイルをどのアプリで開くかは、別の関連付けになります。

5. GitHub CLI・Claude Code で動作確認する

本来の目的だった認証操作を確認します。

gh auth login
claude auth login

今回の環境では、どちらの認証操作でも ChatGPT 内のブラウザではなく、Windows 側のデフォルトブラウザが起動することを確認できました。

これで、認証のたびに ChatGPT アプリをアンインストールする必要はなくなりました。

トラブルシューティング

ここからは、今回の設定中に遭遇した問題と、その切り分けをまとめます。

ランチャーの実行時に Permission denied が出る

今回、最初に遭遇したエラーは次のものでした。

/home/yuhri/.local/bin/windows-browser: 2:
exec: /mnt/c/Windows/System32/rundll32.exe: Permission denied

ランチャー自体には実行権限がありましたが、その呼び出し先である rundll32.exe に実行ビットがありませんでした。

ls -l /mnt/c/Windows/System32/rundll32.exe
-r--r--r-- ... /mnt/c/Windows/System32/rundll32.exe

マウント設定を確認する

findmnt -T /mnt/c/Windows/System32/rundll32.exe \
    -o TARGET,FSTYPE,OPTIONS

cat /etc/wsl.conf

今回の /etc/wsl.conf には、次の設定がありました。

[automount]
mountFsTab=true
options="metadata,umask=022,fmask=111"

実際のマウントオプションにも fmask=111 が反映されていました。

/mnt/c 9p ... metadata;umask=022;fmask=111;...

今回の環境では、この実行ビットを落とす設定が Windows プログラムの起動を妨げていました。

ファイル単体の chmod は失敗した

まず、対象ファイルだけに実行権限を追加しようとしました。

chmod u+x /mnt/c/Windows/System32/rundll32.exe

しかし、次のエラーになりました。

chmod: changing permissions of
'/mnt/c/Windows/System32/rundll32.exe': Permission denied

このログだけでは、権限変更が拒否された詳細な理由までは断定できません。

今回は、Windows のシステムファイルに対する権限変更を続けるのではなく、WSL のマウント設定を修正しました。

fmask=111 を削除する

まずバックアップしてから編集します。

sudo cp -a /etc/wsl.conf \
    "/etc/wsl.conf.bak.$(date +%Y%m%d-%H%M%S)"

sudoedit /etc/wsl.conf

変更したのは、次の1行だけです。

 [automount]
 mountFsTab=true
-options="metadata,umask=022,fmask=111"
+options="metadata,umask=022"

[boot]、[user]、[network] など、ほかの設定はそのまま残します。

この変更は rundll32.exe だけに限定されません。自動マウントされる Windows ドライブ上のファイルの権限表示・実行可否に影響します。

意図的に fmask=111 を設定している場合は、その目的と変更の影響を確認してください。ランチャーの直接実行が既に成功している環境では、この変更は不要です。

作業を保存してから、Windows の PowerShell で実行します。

wsl --shutdown

実行中のすべての WSL ディストリビューションが停止するため、ほかの WSL 環境で動かしている処理にも注意してください。

Ubuntu を起動し直し、確認します。

findmnt -T /mnt/c/Windows/System32/rundll32.exe \
    -o TARGET,FSTYPE,OPTIONS

ls -l /mnt/c/Windows/System32/rundll32.exe

今回の環境では、fmask=111 がなくなり、次の権限表示になりました。

-r-xr-xr-x ... /mnt/c/Windows/System32/rundll32.exe

その後、ランチャーの直接実行で Windows のブラウザが開くようになりました。

"$HOME/.local/bin/windows-browser" https://example.com

ランチャーは動くが、デフォルトアプリに設定できない

Windows 側のブラウザを直接起動できるようになった後も、最初の .desktop では関連付けがうまくいきませんでした。

当初は次の指定を含めていました。

Exec="/home/yuhri/.local/bin/windows-browser" %u
NoDisplay=true

この状態で設定しても、

xdg-mime default windows-browser.desktop x-scheme-handler/http
xdg-mime default windows-browser.desktop x-scheme-handler/https
xdg-settings set default-web-browser windows-browser.desktop

問い合わせ結果は引き続き次のままでした。

chatgpt.desktop

.desktop の配置先を /usr/local/share/applications や /usr/share/applications に変えるだけでも解決しませんでした。

最終的には、次の変更と登録を行うことで成功しました。

  1. Exec を、空白を含まない絶対パスを引用符で囲まない形に変更する
  2. NoDisplay=true を削除する
  3. desktop-file-validate で検証する
  4. update-desktop-database を実行する
  5. gio launch で直接起動を確認する
  6. gio mime で HTTP・HTTPS のデフォルトアプリに設定する

複数の変更をまとめて行っているため、Exec の引用符、NoDisplay=true、登録方法のどれが決定的だったかは、今回の検証だけでは切り分けていません。

本記事では、原因を1つに断定するのではなく、実際に動作した最小構成と手順を掲載しています。

設定したはずなのに別のブラウザが開く

まず、CLI 用の環境変数を確認します。

printf 'BROWSER=%s\n' "$BROWSER"
printf 'GH_BROWSER=%s\n' "$GH_BROWSER"

過去の設定が残っていれば、その意図を確認して修正します。

今回のランチャーへ明示的に統一したい場合は、現在のシェルで次のように設定できます。

export BROWSER="$HOME/.local/bin/windows-browser"
export GH_BROWSER="$HOME/.local/bin/windows-browser"

永続化する場合は、既存設定との重複に注意してシェル設定ファイルを編集してください。

ただし、今回のように URL の関連付けだけで目的を達成できているなら、追加の環境変数設定は必須ではありません。

次に、関連付けの結果を確認します。

gio mime x-scheme-handler/https
xdg-mime query default x-scheme-handler/https

参照している設定ファイルを調べたい場合は、デバッグ出力を使います。

XDG_UTILS_DEBUG_LEVEL=2 \
    xdg-mime query default x-scheme-handler/https

デスクトップ環境やユーザー設定の場所も確認対象です。

printf 'XDG_CURRENT_DESKTOP=%s\n' "$XDG_CURRENT_DESKTOP"
printf 'XDG_CONFIG_HOME=%s\n' "$XDG_CONFIG_HOME"
printf 'XDG_DATA_HOME=%s\n' "$XDG_DATA_HOME"
printf 'XDG_DATA_DIRS=%s\n' "$XDG_DATA_DIRS"

段階ごとにテストすると切り分けやすい

テスト 確認する段階
"$HOME/.local/bin/windows-browser" https://example.com Windows プログラムの呼び出し
gio launch ...windows-browser.desktop https://example.com デスクトップエントリ経由の起動
gio mime x-scheme-handler/https GIO 側の関連付け
xdg-mime query default x-scheme-handler/https XDG 側の既定アプリ
xdg-open https://example.com URL 起動経路全体
gh auth login・claude auth login 実際の利用場面

ランチャーが動かない状態で .desktop の配置先だけを変えたり、既定アプリを繰り返し設定したりしても、原因が分かりにくくなります。

下の層から順に確認するのがポイントです。

補足:ブラウザ候補の並び順を調整する

デフォルトアプリを変更した後、gio mime の結果では、次のように複数の候補が表示されました。

Registered applications:
        windows-browser.desktop
        chatgpt.desktop
        helium.desktop
        mercury-browser.desktop

ChatGPT を候補に残しつつ最後尾にしたい場合は、mimeapps.list の関連付け設定を調整する方法があります。

以下は、その設定例です。この順序への変更後の表示までは、今回の記事の動作確認範囲に含めていません。

編集前に既存ファイルをバックアップします。

mkdir -p "$HOME/.config"

if [ -f "$HOME/.config/mimeapps.list" ]; then
    cp -a "$HOME/.config/mimeapps.list" \
        "$HOME/.config/mimeapps.list.bak.$(date +%Y%m%d-%H%M%S)"
fi

~/.config/mimeapps.list の該当箇所を、次のように編集します。

[Default Applications]
x-scheme-handler/http=windows-browser.desktop;
x-scheme-handler/https=windows-browser.desktop;

[Added Associations]
x-scheme-handler/http=windows-browser.desktop;helium.desktop;mercury-browser.desktop;chatgpt.desktop;
x-scheme-handler/https=windows-browser.desktop;helium.desktop;mercury-browser.desktop;chatgpt.desktop;

既存ファイル全体を上書きせず、ほかの MIME タイプの設定を残してください。同名セクションや同じキーを重複追加しないようにします。

設定後は、次で結果を確認します。

gio mime x-scheme-handler/http
gio mime x-scheme-handler/https

候補一覧の表示順と、実際のデフォルトアプリは分けて考える必要があります。ChatGPT が候補に表示されていても、デフォルトが windows-browser.desktop であれば、それだけで ChatGPT が自動起動することを意味するわけではありません。

まとめ

今回の問題は、次の2段階に分かれていました。

  1. /mnt/c の fmask=111 により、ランチャーから rundll32.exe を起動できなかった
  2. ランチャーが動くようになっても、最初の .desktop と登録手順ではデフォルトアプリとして採用されなかった

マウント設定を修正し、最小構成の .desktop を作成して、gio mime で HTTP・HTTPS のデフォルトアプリに設定することで解消しました。

最終的に、次のすべてで Windows 側のブラウザが起動することを確認できました。

xdg-open https://example.com
gh auth login
claude auth login

意図しないアプリで認証ページが開く場合は、アプリを削除する前に、URL の関連付けとブラウザの起動経路を確認してみてください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?