如何在Perl中匹配IP地址?
我有一个本地DNS脚本,我从一个以前的员工那里继承下来,需要比较一些值,看看它们是否匹配特定的MX记录和IP地址 我的MX部件已经放下了,好的:如何在Perl中匹配IP地址?,perl,ip-address,Perl,Ip Address,我有一个本地DNS脚本,我从一个以前的员工那里继承下来,需要比较一些值,看看它们是否匹配特定的MX记录和IP地址 我的MX部件已经放下了,好的: 120 $doug = doug.local 139 if ($mx_record =~ /$doug/) { 140 print ("Mail on doug.\n"); 141 } 142 else { 143 print ("Not on doug.\n"); 144 } $mx_
120 $doug = doug.local
139 if ($mx_record =~ /$doug/) {
140 print ("Mail on doug.\n");
141 }
142 else {
143 print ("Not on doug.\n");
144 }
$mx_record
是mx查询中的一行,如下所示:
thomas. 302 IN MX 10 doug.local.
现在我需要看看A记录是否匹配
查询中的$a_record
变量如下所示
thomas. 300 IN A 10.0.0.47
如何执行条件语句来匹配IP地址
我需要在变量中定义IP,然后查看
$a_record
变量是否包含已定义的IP。这将匹配看起来像IP地址的条目,但也将匹配999.999.999.999。请确保在使用匹配的地址之前对其进行验证
if ($mx_record =~ /(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/) {...}
这将匹配看起来像ip地址的条目,但也将匹配999.999.999.999。请确保在使用匹配的地址之前对其进行验证
if ($mx_record =~ /(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/) {...}
试试这个:
if ($mx_record =~ /A\w+(<record_ip>(?:/[0-9]{1,3}.){4})/ {
print $record_ip
}
if($mx_-record=~/A\w+((?:/[0-9]{1,3}。){4})/{
打印$record\u ip
}
这将检查后面是否有空格,后面是否有虚线四元组。四元组保存在变量$record_ip中。请尝试以下操作:
if ($mx_record =~ /A\w+(<record_ip>(?:/[0-9]{1,3}.){4})/ {
print $record_ip
}
if($mx_-record=~/A\w+((?:/[0-9]{1,3}。){4})/{
打印$record\u ip
}
这将检查后面是否有空格,后面是否有虚线四元组。四元组保存在变量$record_ip中我相信有更好的方法,但这将使您非常接近:
if($a_record =~ /((?:\d{1,3}\.){3}\d{1,3})/) {
warn "IP was: $1";
}
# IP was: 10.0.0.47
这与
10.0.0.
匹配,然后是最终的47
我相信有更好的方法,但这会让您非常接近:
if($a_record =~ /((?:\d{1,3}\.){3}\d{1,3})/) {
warn "IP was: $1";
}
# IP was: 10.0.0.47
my $a_record = 'thomas. 300 IN A 10.0.0.47';
my $ip = '10.0.0.47';
if ($a_record =~ /\b(\Q$ip\E)$/) {
print "Matches: $1\n";
}
这与
10.0.0.
匹配,然后是最后的47
由于IP地址可能不是最紧凑的十进制表示法,我建议您使用Socket
模块中的inet\u aton()
函数:
my $a_record = 'thomas. 300 IN A 10.0.0.47';
my $ip = '10.0.0.47';
if ($a_record =~ /\b(\Q$ip\E)$/) {
print "Matches: $1\n";
}
use Socket;
my $ip_to_match = inet_aton('10.0.0.47');
...
if (inet_aton($field) == $ip_to_match) {
...
}
注意:假设DNS记录已被拆分为其组成部分,因为IP地址可能不是最紧凑的十进制表示法,我建议您使用
Socket
模块中的inet\u aton()
函数:
use Socket;
my $ip_to_match = inet_aton('10.0.0.47');
...
if (inet_aton($field) == $ip_to_match) {
...
}
注意:假设DNS记录已拆分为其组件部分如果您只想匹配IPv4正则表达式,请使用 与其在整个生产线上运行正则表达式,不如更安全地标记它们并根据需要匹配各个部分
use strict;
use warnings;
use Data::Dumper;
sub parse_record {
my $line = shift;
# special rules for parsing different types
my %More4Type = (
MX => sub { return( priority => $_[0], provider => $_[1] ) },
default => sub { return( provider => $_[0] ) }
);
my(%record, @more);
(@record{qw(host uhh class type)}, @more) = split /\s+/, $line;
my $more_func = $More4Type{$record{type}} || $More4Type{default};
%record = (%record, $more_func->(@more));
return \%record;
}
while(my $line = <DATA>) {
print Dumper parse_record($line);
}
__END__
thomas. 302 IN MX 10 doug.local.
thomas. 300 IN A 10.0.0.47
google.com. 24103 IN NS ns2.google.com.
使用严格;
使用警告;
使用数据::转储程序;
子记录{
我的$line=shift;
#用于分析不同类型的特殊规则
我的%More4Type=(
MX=>sub{return(优先级=>$\[0],提供程序=>$\[1]),
默认值=>sub{return(provider=>$\[0])}
);
我的%(记录,@更多);
(@record{qw(hostuhh类类型)},@more)=split/\s+/,$line;
my$more_func=$More4Type{$record{type}}| |$More4Type{default};
%记录=(%record,$more_func->(@more));
返回\%记录;
}
while(我的$line=){
打印转储程序解析_记录($line);
}
__结束__
托马斯。302在MX 10道格。本地。
托马斯在10.0.0.47的比赛中得到了300分
NS ns2.google.com中的google.com.24103。
现在您已经解析了这行代码,只需查看$record{type}
和$record{provider}
或您需要的任何内容即可。只需稍加努力,这将更加灵活,更不容易出现错误
尽管可能有一些东西可以帮您进行解析。如果您只想匹配IPv4正则表达式,请使用 与其在整个生产线上运行正则表达式,不如更安全地标记它们并根据需要匹配各个部分
use strict;
use warnings;
use Data::Dumper;
sub parse_record {
my $line = shift;
# special rules for parsing different types
my %More4Type = (
MX => sub { return( priority => $_[0], provider => $_[1] ) },
default => sub { return( provider => $_[0] ) }
);
my(%record, @more);
(@record{qw(host uhh class type)}, @more) = split /\s+/, $line;
my $more_func = $More4Type{$record{type}} || $More4Type{default};
%record = (%record, $more_func->(@more));
return \%record;
}
while(my $line = <DATA>) {
print Dumper parse_record($line);
}
__END__
thomas. 302 IN MX 10 doug.local.
thomas. 300 IN A 10.0.0.47
google.com. 24103 IN NS ns2.google.com.
使用严格;
使用警告;
使用数据::转储程序;
子记录{
我的$line=shift;
#用于分析不同类型的特殊规则
我的%More4Type=(
MX=>sub{return(优先级=>$\[0],提供程序=>$\[1]),
默认值=>sub{return(provider=>$\[0])}
);
我的%(记录,@更多);
(@record{qw(hostuhh类类型)},@more)=split/\s+/,$line;
my$more_func=$More4Type{$record{type}}| |$More4Type{default};
%记录=(%record,$more_func->(@more));
返回\%记录;
}
while(我的$line=){
打印转储程序解析_记录($line);
}
__结束__
托马斯。302在MX 10道格。本地。
托马斯在10.0.0.47的比赛中得到了300分
NS ns2.google.com中的google.com.24103。
现在您已经解析了这行代码,只需查看$record{type}
和$record{provider}
或您需要的任何内容即可。只需稍加努力,这将更加灵活,更不容易出现错误
虽然可能有什么东西可以帮你进行解析。为什么你要将模式限制为0-5的数字?这怎么可能匹配192.168.x.x空间中的一个私有字符?…因为我突然开始考虑旧的(非CIDR网络掩码…将修复。为什么要发布未经测试的代码?您想要的是\s+,而不是\w+。您应该引用\,或者它匹配任何字符。正则表达式查找带有尾随点的地址。此代码可能工作的唯一原因是行末尾的\n作为地址的一部分进行了分析。请尝试:如果(/A\s+((?:[0-9]{1,3}\){3}[0-9]{1,3}/)为什么要将模式限制为0-5的数字?这怎么可能与192.168.x.x空间中的私有模式匹配?…因为我突然开始想到旧的(非CIDR网络掩码…将修复。为什么要发布未经测试的代码?您想要的是\s+,而不是\w+。您应该引用\,或者它匹配任何字符。正则表达式查找带有尾随点的地址。此代码可能工作的唯一原因是行末尾的\n作为地址的一部分进行了分析。请尝试:如果(/A\s+((?:[0-9]{1,3}\){3}[0-9]{1,3}/)这是正确的方法…只要验证四元结构的每个部分在0-25范围内。这是正确的方法…只要每个pa