コマンドラインでルータのグローバルアドレスを知る

もう2つ書いちゃったので、言及にしておきます。question:1109355711
LL言語スクリプトを書いてコマンドにしておくというのが妥当なんだろうけど、普通のLinux環境で普通の人でもできそうなワンライナーな答えを考える。まず思い付いたのはこれかな。

$ w3m http://checkip.dyndns.org -dump | awk '{print $4}'

w3m が入っているかは微妙だけど、パッケージとしてのインストールは簡単だし、ubuntu にはデフォルトで入っていた。外部サービスに依存しちゃうというのも欠点だけど、dyndns ならいきなりなくなるとかいうこともないだろうし。
欠点は透過proxyを仕込まれていた場合は、違うアドレス(いつでもISPのProxyアドレス)になってしまうところか。使っているもと勤務先のISPはhttpは無条件に透過proxyなので、この手はうまくいかない。外すことすらできない。そういう場合は、dyndns にアカウントを登録して自分の情報ページから https で取り出さなくてはならない。テキストだけを出してくれるわけではないので、HTMLのパースがややめんとくさい。
ベストは、ルータにSNMPで問い合わせするか、設定画面のHTMLをパースして取得する方法だろうな。前者はSNMP機能が殺されて出荷されているルータが多いのでダメなこともある。低価格なルータでも、SNMPの機能は実装されていないことはほとんどないのだけど、低価格なものほどサポートがめんどくさい機能は殺されてしまうのだ。後者もHTMLのパースがめんどくさいという事には変わりはない。
ルータのHTMLをパースするのも、認証がBASIC認証でないルータも多くなってめんどくさい。おまけに、表示をjavascriptでやっているものも多くなっているので、単純に見えるものをだけをダンプしても表示されなかったりする。ルータを変更したり、ルータのファーム更新でアドレス抽出部分が使えなくなってしまうかもしれない。
家で使っている バッファローの BBR-4MG で試してみたら、認証はBASICでなく、ルータ側でアクセス可能なアドレスを保存しているようだ。ログアウトしなければいいようだけど、いつタイムアウトしてしまうかはわからない。つまりは実質的に使えないということのようだ。タイムアウト前であれば、こんな感じで取得できるけど、この方法も決定打ではないな。

$ w3m http://xxx.xxx.xxx.xxx/ad-admin-system.stm -dump_source | grep 0].wan_ip= | awk 'BEGIN { FS = "\"" } ; { print $2 }'

だれか、決定的なソリューションがあったら紹介してくださいませ。