はじめに
WSL2上で aws sso login を実行すると、認証用のブラウザを自動で開こうとして xdg-open が走るのですが、こいつがあらゆるブラウザを順番に試して全部失敗する現象に陥ります。
もちろんこの現象は aws sso login に限った話ではなくWSL2上からブラウザを開こうとした場合全般に当てはまります。
TL; DR
以下を実行すればOK
sudo apt update
sudo apt install wslu
環境
- Windows 11 + WSL2 (Ubuntu)
- AWS CLI v2
- Windows側のデフォルトブラウザ: Google Chrome
問題の挙動
aws sso login を叩くと、こんな感じで延々とブラウザを探しに行って全部コケます。
$ aws sso login --profile my-profile
Attempting to automatically open the SSO authorization page in your default browser.
If the browser does not open or you wish to use a different device to authorize this request, open the following URL:
https://device.sso.ap-northeast-1.amazonaws.com/?user_code=XXXX-XXXX
/usr/bin/xdg-open: 882: www-browser: not found
/usr/bin/xdg-open: 882: links2: not found
/usr/bin/xdg-open: 882: elinks: not found
/usr/bin/xdg-open: 882: links: not found
/usr/bin/xdg-open: 882: lynx: not found
/usr/bin/xdg-open: 882: w3m: not found
xdg-open: no method available for opening 'https://device.sso.ap-northeast-1.amazonaws.com/?user_code=XXXX-XXXX'
WSL2にはGUIブラウザが入っていないので当然と言えば当然です。AWS CLIは内部で xdg-open を呼んでいるだけなので、xdg-open がWindows側のブラウザを開いてくれるようになれば解決します。
解決策: wslu を入れる
wslu (Windows Subsystem for Linux Utilities) には wslview というコマンドが含まれていて、これがWSL内から呼ばれた xdg-open の処理をWindows側のデフォルトブラウザに横流ししてくれます。
インストール
sudo apt update
sudo apt install wslu
これだけです。
wslu をインストールすると xdg-open の代替として wslview が使われるようになり、URLがWindows側のデフォルトブラウザで開くようになります。
動作確認
xdg-open https://www.google.com
Windows側のChromeが立ち上がればOKです。
aws sso login を再実行
aws sso login --profile my-profile
今度はちゃんとWindows側のChromeが立ち上がって認証画面が表示されます。コピペ作業から解放されました。
仕組みの補足
wslu を入れると /usr/bin/xdg-open の挙動が wslview 経由でWindows側に転送されるようになります。wslview は内部で cmd.exe /c start 相当の処理をやっていて、Windowsの既定ブラウザ設定に従ってブラウザを起動します。
つまり、Windows側で既定のブラウザをEdgeにしていればEdgeが、Firefoxにしていればfirefoxが開きます。Chromeを使いたければWindows側の既定ブラウザをChromeにしておけばOKです。
Chromeを名指しで起動したい場合
「既定ブラウザは別のやつにしているけど、WSLからの起動だけはChromeで開きたい」みたいな捻れた要求がある場合は、xdg-open を自前のスクリプトで差し替える手もあります。
~/.local/bin/xdg-open にこんな感じで置いておきます。
#!/bin/bash
CHROME="/mnt/c/Program Files/Google/Chrome/Application/chrome.exe"
arg="$1"
# URLじゃない場合はWindowsパスに変換
if [[ "$arg" != http* ]]; then
arg="$(wslpath -w "$arg")"
fi
exec "$CHROME" "$arg"
chmod +x ~/.local/bin/xdg-open
~/.local/bin が PATH の先頭側にあれば、こちらが優先されます。ただし普通の用途なら wslu で十分です。
まとめ
- WSL2で
aws sso loginがxdg-openでコケるならsudo apt install wsluで一発解決 - Windows側のデフォルトブラウザがそのまま使われる
- Chromeを名指しで開きたい場合は
xdg-openを自前スクリプトで差し替え
地味ですが開発体験が一段上がるので、WSL2勢にはおすすめです。
また、今回はwsluのなかのwslviewだけの話でしたが他にも機能があるので気になる方はぜひ調べてみてください。