1

デバイスの名前が DNS に存在するかどうかを確認し、存在しない場合はデバイスの名前を出力する Perl スクリプトを作成しようとしています。現在、これは私がそれを行う方法です:

my $host_result = `host $device`;
my @host_result = split(/ /, $host_result);
my $dns = $host_result[0];

# host normally puts out something like this if there is an error:
# Host blah not found: 3(NXDOMAIN)
# So I check to see if the first word is 'Host'
if ($dns eq "Host") {
    print $device;
}

ご覧のとおり、システムのhostコマンドを使用してこれを行います。より具体的にはhost、デバイスの名前を見つけることができるかどうかを確認します。

これが目的ではないことはわかっておりhost、本当に必要でない限りシステム コールを使用したくないので、DNS に対してこれらのデバイス名をチェックできるようにする Perl モジュールを誰かが教えてくれることを期待していました。私は Net::DNS を推測していますが、これを達成するために Net::DNS 内で具体的に何を使用する必要がありますか?

私はグーグルで検索しましたが、何を探すべきかわからないため (DNS クエリですか? または DNS 解決ですか?)、DNS と関連する用語の基本的な知識しか持っていないため、何かを見つけるのに苦労しています。それに。

また、私は多くのデバイス名を渡しているので、チェックを高速化する方法についてのヒントは大歓迎です!

4

1 に答える 1

2

私もDNSについてあまり詳しくありませんが、これはNet::DNS::Resolverhostを使用したアプローチとほぼ同等だと思います:

#!/usr/bin/perl

use strict;
use warnings;
use feature 'say';

use Net::DNS::Resolver;

my $device = shift;
my $res = Net::DNS::Resolver->new;
say $device unless $res->search($device); # Returns undef if not found

速度に関しては、簡単なベンチマークを行いました。Net::DNS::Resolversystem("host $device")は、クエリごとに同じ Resolver オブジェクトを再利用する場合よりもはるかに高速です。ホストが DNS にない場合のタイミング結果は次のとおりです。

          Rate   system Net::DNS
system   233/s       --     -60%
Net::DNS 578/s     148%       --

ホストがDNSにある場合は、さらに大きな違いがあります。

          Rate   system Net::DNS
system   232/s       --     -69%
Net::DNS 758/s     227%       --

ベンチマークに使用したコードは次のとおりです。

#!/usr/bin/perl

use strict;
use warnings;
use feature 'say';

use Benchmark qw(cmpthese);
use Net::DNS::Resolver;

our $device = shift;
our $res = Net::DNS::Resolver->new;

cmpthese(1000, {
    system     => sub { system("host $device > /dev/null 2>&1"); },
    'Net::DNS' => sub { $res->search($device); }
});

また、Net::DNS::Resolverにはバックグラウンドでクエリを実行し、すぐに戻る機能があることがわかります。速度が本当に問題である場合は、このようにクエリを送信し、新しいプロセスをフォークして、準備が整い次第結果を確認してみてください。または、通常のフォアグラウンドsearch()関数への呼び出しごとにプロセスをフォークすることもできます。もちろん、チェックしているホストの数によっては、このアプローチではメモリまたはプロセスの制限に達する可能性があることに注意してください。

于 2013-08-06T16:35:46.197 に答える