IDNに変換する大規模ドメインのリストを処理するには、次のコマンドを使用しています。
cat list | idn > clean
リスト形式の例:
президент.рф
mañana.com
bücher.com
café.fr
cliché.com
hualañe.cl
köln-düsseldorfer-rhein-main.de
mūsųlaikas.lt
sendesık.com
sushicorner-würzburg.de
domain.com
# almost 1 M lines
ただし、次のメッセージが表示されます。
idn: idna_to_ascii_4z (big list): Output would be too big or too small
次に、私のリストが許可された制限(大きすぎるか小さすぎる)を超えていないことを確認する必要があります。
私はこれを見つけました:
RFC 1035FQDNの長さは255文字に制限され、各ラベル(ホスト名からドットで区切られたノード)は63文字に制限されます。
そして
文字数制限ボタン1個(例:t.co)
質問: ホスト名が63文字より大きく1文字未満のドメインをコマンドラインからリストから削除するにはどうすればよいですか? (bashはエラーなしでidnを実行します)
アクション: 私は次のことを試しました(これはすべて1つのコマンドで欲しいが)(いくつかのソース):
sed -n '/.\{63\}/p' list > out
grep -vi -f <(sed 's:^\(.*\)$:\\\1\$:' out) list | sort -u > out2
ただし、idnコマンドを実行すると、同じメッセージidnが表示されます。
cat out2 | idn
idn: idna_to_ascii_4z (big list): Output would be too big or too small
助けてくれてありがとう。
PD:おそらく問題はIDNのサイズとリスト(非常に大きい)に関連しているでしょう。全然知らない。処理するIDNドメイン|ホスト名の行数に制限があるかどうかわかりません。ヘルプファイルはこれに関する多くの情報を提供しません。
修正する: 問題は解決しましたが、スパム事故のために作者@casによって正解が削除されました。投票終了
答え1
idn
エラーで終了せず、許可されない文字列をスキップするスイッチがないと思うので、残りの唯一のオプションは次のとおりです。予想される間違い:
idn_skip(){
while ! error=$(idn 2>&1 >&3); do
case $error in *'Punycode failed'*|*'Output would be too large'*) ;; # restart
*) break;;
esac
done 3>&1
}
idn_skip < domain_list
これは醜くて愚かで、検索できないファイルからドメインリストを読み取ると機能しません(bashスタイルを実行して解決できますが、stdbuf -i1 idn
もっと面白いです)。
idn
Net::LibIDN
私の提案は、Perlパッケージ(Debianの場合)を使用しapt-get install libnet-libidn-perl
て制限を克服しようとするのではなく、Perlですべてを書くことです。