@ledsun blog

無味の味は佳境に入らざればすなわち知れず

WSL向けのWindowsポートフォワード設定をスクリプト化する

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 

としないと削除できません。 ホストのWindowsIPアドレスを取得するのがなかなか面倒です。 また、IPアドレス変わったら、自動では消せません。 IPアドレスなしでポートフォワード設定するのが良いようです。