wget がエラーになる。
wget が名前解決エラーになる場合、ipv6 アドレスへ接続に行き、接続失敗することがある。
wgetrc
を設定ファイルに書いてもユーザーごとになってしまうので、システムグローバルに適用する wgetrcファイル に設定を掛けば、自動実行のプロセスやフォークした先でも大丈夫。
openwrt で wget を使っているので opkg update が失敗する。v6アドレス怖い。
/bin/uclient-fetch の場合も同じ
uclient-fetchが内部的に使われてるバージョンがあるので、uclient-fetch を wget に入れ替える必要がある。
mv /bin/uclient-fetch /bin/uclient-fetch.orig ln -s /usr/bin/wget /bin/uclient-fetch
openwrt は busybox の wget から独自仕様のuclient-fetchに変わって行くようです。
ただ、wget に切り替えると、単純なuclient-fetchとちがいSSLを厳密にチェックするので、エラーが出る可能性がある。 そこでwgetrc に以下を追加する。
/etc/wgetrc
inet4_only = on check-certificate = no
wgetrc で v4 へ固定する。
解決策は2つ
wget 引数
wget -4 https://example.com ## または alias wget='wget -4 '
ただし、スクリプトから/bin/wget
が呼ばれる場合は対応できない。
/etc/wgetrc
inet4_only = on
これで解決する。ipv6 の名前解決をとめてもいいし、alias でもいいし、wgetrcでもいい。wgetrc が個人的には影響範囲が少なくてファイルを指定するのが楽な手法だと思う。
ほんと、フレッツのv6ってやつは面倒を引き起こす。
ただし wget パッケージ依存
wget が busybox 提供のミニマム版だとwegetrc を読み込んでくれないので フルパッケージをインストールする必要があった。
opkg install wget echo inet4_only = on > /etc/wgetrc
それでも解決しない場合。
外部スクリプトから直接呼ばれる場合など、wget を移動させて強引に解決する。
/usr/bin/wget
が /usr/bin/wget.back -4
を呼ぶように改造
mv /usr/bin/wget /usr/bin/wget.bak touch /usr/bin/wget chmod +x /usr/bin/wget cat <<EOF > /usr/bin/wget #!/bin/sh ## 2021-12-02 ntt v6 /usr/bin/wget.bak -4 "\$@" EOF
もとに戻す。
mv /usr/bin/wget.bak /usr/bin/wget
2021-12-02
強引に解決する方法を追記。
2023-10-16
追記
2024-08-10
uclient-fetch に付いて追加
参考資料
https://www.gnu.org/software/wget/manual/html_node/Wgetrc-Location.html