• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:検索するプログラム)

未使用IPを検索するプログラム

このQ&Aのポイント
  • 検索するプログラムについての質問です。以前の質問でもうまくいかなかったため、原因を調査しました。HOSTSファイルに記載されているIPアドレスの表示が異なっていることが原因と考えられます。
  • 質問内容は、社内でIPアドレスの管理をしており、ログから未使用のIPアドレスを検索したいというものです。ログの11番目のフィールドにIPアドレスが記載されており、サーバのHOSTSファイルにはすべてのIPアドレスが記述されています。
  • 以前の回答では、Perlスクリプトを使用して未使用のIPアドレスを検索していました。まず、使用されているIPアドレスを収集し、その後、HOSTSファイルに記載されているIPアドレスと照合し、未使用のIPアドレスを見つけ出しています。

質問者が選んだベストアンサー

  • ベストアンサー
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

例えば、こんなふうにするとか。 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しか考えてませんが。

picca
質問者

補足

ご回答ありがとうございます。 上記のスクリプトでためしてみたのですが うまくいきません。 他に原因はあるでしょうか?

その他の回答 (1)

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.2

> 上記のスクリプトでためしてみたのですがうまくいきません。 ありゃ。typoしてました。 誤: inet_ntoa 正: inet_aton 基本的に、比較が正しく行われるよう、データを正規化してあげましょう。 先にあげたスクリプトでは、Socket::inet_aton()を使って、ドット形式を、4バイト・データ(にしたものをunpckして16針文字列)に直すというアプローチだったんだけど。 こんなふうに: % perl -MSocket -e 'print unpack("H*", inet_aton("10.255.128.1"))' 0aff8001

picca
質問者

補足

ありがとうございます。 すみませんpealはほとんど初心者なもので。 上記の 誤: inet_ntoa 正: inet_aton を直すだけでよろしいのでしょうか? よろしくお願いいたします。

関連するQ&A