idn: 디버깅 최소 및 최대 제한 목록

idn: 디버깅 최소 및 최대 제한 목록

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을 실행합니다)

행동: 나는 다음을 시도했습니다(비록 이 모든 것을 하나의 명령으로 원하지만)(일부 소스):

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더 우스꽝스럽습니다).

idnNet::LibIDN내 제안은 Perl 패키지( 데비안의 경우)를 사용 apt-get install libnet-libidn-perl하고 한계를 극복하려고 노력하기보다는 Perl로 모든 것을 작성하는 것입니다.

관련 정보