ファイルから設定にCIDRを追加する最良の方法は何ですか?

ファイルから設定にCIDRを追加する最良の方法は何ですか?

CIDRそのため、項目(たとえば)を含む複数のファイルがあります1.1.1.0/24。タスクは、NFTablesbashスクリプトを使用してこれらのファイルのエントリをグループに追加することです。そうすることで、私はOpenWRTユーティリティに限定されます。

問題は、これらのファイルに多くのエントリがあるため、エントリの制限を超える可能性があることです。コマンドあたり4096文字。そして、これらのファイルは自動的に更新されるため、cron定期的にファイルセットも削除して再入力する必要があります。

私がしたよりも簡単な方法があるようです。また、この混乱の実行時間を短縮したいと思います。これが私の試みです。

nft add element $TARGET_SET { $(awk '{print $1 ", "}' "$CUSTOM_CIDRS_FILE") }

ここにもう一つ質問があります。自分のファイルにエントリ数が多い場合、コマンドごとに4096文字の制限を克服できますか?最後の質問です。ループに一度に1つの項目を追加すると、グループを形成するのに時間がかかりますか?

私は主によく練習された答えを待っています。

ベストアンサー1

awk特定の長さに保持できる実行される文字列を構成することが可能です。これはパイプラインをxargsフォークするよりもはるかにecho ... | tr効率的です。

#!/usr/bin/env awk
{
    len = length()
    if (len > limit) {
        if (length(outbuf)) {
            system("echo " ENVIRON["TARGET_SET"] outbuf)
        }
        outbuf = $0
        # the limit will be 4096 minus the length of the rest of
        # the command and if the 4096 is kern.argmax then you
        # may need to subtract even more to account for the
        # length of the environment variables!
        limit = 6
    } else {
        # join another field to output buffer
        outbuf = outbuf "," $0
    }
    # the plus is for the length of the field joiner
    limit -= len + 1
}
END {
    if (length(outbuf)) {
        system("echo " ENVIRON["TARGET_SET"] outbuf)
    }
}

このスクリプトの内容は"echo "テスト用であり、適切なnft ...コマンドを実行できます。環境で読みやすいようTARGET_SETにエクスポートする必要があります。awk

おすすめ記事