WSL上で動かしているWebアプリケーションを外部から参照する - @ledsun blog で手動でやる方法はわかりました。 毎回手動でやるのは、思い出すのが大変なので、スクリプトにしました。
FOR /F "usebackq" %%i in (`wsl exec hostname -I`) DO @SET IP=%%i netsh interface portproxy add v4tov4 listenport=8000 connectaddress=%IP%
で、有効にします。
netsh.exe interface portproxy delete v4tov4 8000
で、無効にします。 スクリプト化して良いことは、管理者権限でPowerShellを立ち上げなくて良くなったことです。 デスクトップにでも置いておいて、右クリックから「管理社として実行(A) 」できます。
バッチファイルでコマンドの実行結果を変数に代入
FOR /F "usebackq" %%i in (`wsl exec hostname -I`) DO @SET IP=%%
の部分です。なんで実行結果を取得するのにFor文が出てくるんだ?って思うけど、こう書くみたいです。
バッチファイルでコマンドの実行結果を変数に格納する | まくまくWindowsノート
FOR ループに /f "usebackq" オプションを指定することで、バッククォートで囲まれた文字列がコマンドとして解釈されるようになります。
なんだそりゃ?って感じです。 PowerShellで書いたら、もうちょっとなんとかなるのでしょうか?
消しやすいポートフォワード設定
netsh.exe interface portproxy delete v4tov4 8000
の部分です。 この命令、IPアドレスとポート番号がフルマッチです。
あるIT技術者の障害(じゃなくて生涯)対応 : ●Windowsのnetshコマンドで設定したポートフォワード設定を削除しようとしてエラー
listenportとlistenaddressは両方必要という事ですね( ´ー`)
前回みたいに、
netsh.exe interface portproxy add v4tov4 listenaddress=192.168.1.50 listenport=8000 connectaddress=172.25.208.56
て、設定しちゃうと
netsh.exe interface portproxy delete v4tov4 8000
では、削除できなくて、
netsh.exe interface portproxy delete v4tov4 listenaddress=192.168.1.50 listenport=8000
としないと削除できません。 ホストのWindowsのIPアドレスを取得するのがなかなか面倒です。 また、IPアドレス変わったら、自動では消せません。 IPアドレスなしでポートフォワード設定するのが良いようです。