我有一个本地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_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。
答案 0 :(得分:3)
如果您只想匹配IPv4正则表达式,请使用Regexp::Common::net。
不是在整行上运行正则表达式,而是更加安全地对它们进行标记化并根据需要匹配各个部分。
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.
现在您已经解析了这条线,只需查看$record{type}
和$record{provider}
或您需要的任何内容即可。为了一点点努力,这更灵活,更容易出错。
尽管CPAN上可能还有一些东西要为你解析。
答案 1 :(得分:2)
我确信有更好的方法,但这会让你非常接近:
if($a_record =~ /((?:\d{1,3}\.){3}\d{1,3})/) {
warn "IP was: $1";
}
# IP was: 10.0.0.47
这与10.0.0.
匹配,然后与最终47
匹配。
答案 2 :(得分:1)
这将匹配看起来像IP地址的条目,但也将匹配999.999.999.999。确保在使用之前验证匹配的地址。
if ($mx_record =~ /(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/) {...}
答案 3 :(得分:1)
试试这个:
if ($mx_record =~ /A\w+(<record_ip>(?:/[0-9]{1,3}.){4})/ {
print $record_ip
}
这将检查A后跟空格,后跟虚线四边形。四元组保存在变量$ record_ip
中答案 4 :(得分:0)
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";
}
答案 5 :(得分:0)
由于IP地址可能不是最紧凑的十进制表示法,我建议您使用inet_aton()
模块中的Socket
函数:
use Socket;
my $ip_to_match = inet_aton('10.0.0.47');
...
if (inet_aton($field) == $ip_to_match) {
...
}
注意:假设DNS记录已经拆分为其组成部分