- ベストアンサー
未使用IPを検索するプログラム
- 検索するプログラムについての質問です。以前の質問でもうまくいかなかったため、原因を調査しました。HOSTSファイルに記載されているIPアドレスの表示が異なっていることが原因と考えられます。
- 質問内容は、社内でIPアドレスの管理をしており、ログから未使用のIPアドレスを検索したいというものです。ログの11番目のフィールドにIPアドレスが記載されており、サーバのHOSTSファイルにはすべてのIPアドレスが記述されています。
- 以前の回答では、Perlスクリプトを使用して未使用のIPアドレスを検索していました。まず、使用されているIPアドレスを収集し、その後、HOSTSファイルに記載されているIPアドレスと照合し、未使用のIPアドレスを見つけ出しています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
例えば、こんなふうにするとか。 use Time::Local; > use Socket; my $ptnDate = '(\d\d)(\d\d)(\d\d)\-(\d\d)'; my %chkIP; # 使用されているIPを拾う my @files = glob("ログのパス"); while (@files) { next unless /$ptnDate\.log$/; my $tm = timelocal(0,0,$4,$3,$2-1,$1+100); next if $tm < time() - 90*24*60*60; # 90日より前なら見ない open LOG, "$_" or die $!; while (<LOG>) { my $ip = (split /\x20/)[11]; # \x20 はスペースのコード > $ip = unpack( "H*", inet_ntoa( $ip ) ); $chkIP{$ip} = 1; # 見つけたIPをチェック } close LOG; } # 未使用のIPを探す my %notUsed; open HOSTS, "HOSTSのパス" or die $!; while (<HOSTS>) { next unless /^(\d+\.\d+\.\d+\.\d+)/; > my $ip = unpack( "H*", inet_ntoa( $1 ) ); > $notUsed{$1} = 1 unless $chkIP{$ip}; } close HOSTS; IPv4しか考えてませんが。
その他の回答 (1)
- osamuy
- ベストアンサー率42% (1231/2878)
> 上記のスクリプトでためしてみたのですがうまくいきません。 ありゃ。typoしてました。 誤: inet_ntoa 正: inet_aton 基本的に、比較が正しく行われるよう、データを正規化してあげましょう。 先にあげたスクリプトでは、Socket::inet_aton()を使って、ドット形式を、4バイト・データ(にしたものをunpckして16針文字列)に直すというアプローチだったんだけど。 こんなふうに: % perl -MSocket -e 'print unpack("H*", inet_aton("10.255.128.1"))' 0aff8001
補足
ありがとうございます。 すみませんpealはほとんど初心者なもので。 上記の 誤: inet_ntoa 正: inet_aton を直すだけでよろしいのでしょうか? よろしくお願いいたします。
補足
ご回答ありがとうございます。 上記のスクリプトでためしてみたのですが うまくいきません。 他に原因はあるでしょうか?