我想获取Bios序列号,然后使用Perl检查它是否存在于网页内容中,我试过这段代码:
#!/usr/bin/perl
use LWP::Simple;
my $serial = qx(wmic bios GET SerialNumber 2>&1);
my $source = get("http://localhost/Check/serials.txt");
my $ff = "$serial";
if ("$source" =~ "$ff"){
print "Serial Found ^_^\n";
}else{
print "Sorry , Serial Not Found In Our Database !!\n";
}
*网址http://localhost/Check/serials.txt
包含序列号列表。
但是脚本总是给我Sorry , Serial Not Found In Our Database !!
但是我的Bios的序列号被找到!!
答案 0 :(得分:0)
这里有几个问题,都与各种字符串的确切内容有关。
WMIC命令不仅仅提交61-1210-000747-00101111-071595-M747
,因为它意味着命令行界面,并且必须在该上下文中看起来不错
请注意,我无法直接测试,因为我的Windows系统是手工制作且没有序列号
相反,它会返回类似
的内容"SerialNumber \r\n61-1210-000747-00101111-071595-M747\r\n\r\n"
并在Intranet上的serials.txt
文件中搜索它几乎必然会失败。您需要使用类似
my $response = qx(wmic bios GET SerialNumber);
my ($serial) = $response =~ /^SerialNumber\s+(\S+)/;
使用正则表达式模式搜索Intranet上serials.txt
的内容时也存在问题。最好正确地解析该文件的内容,但是你不能显示它的样子
相反,您可以在正则表达式模式中使用\Q...\E
,以便可以在字面上处理序列号中可能包含的任何正则表达式元字符。您还需要在\b...\b
中将其包围,以便123A
之类的序列号不会被验证"因为它恰好是ABC-123AD-59F
文件中serials.txt
的子字符串
这应该对你有用
#!/usr/bin/perl
use strict;
use warnings 'all';
use LWP::Simple 'get';
use Data::Dump 'dump';
use constant SERIALS_URL => 'http://localhost/Check/serials.txt';
my $response = qx(wmic bios GET SerialNumber);
my ($serial) = $response =~ /^SerialNumber\s+(\S+)/
or die sprintf qq{Unexpect response %s\n from WMIC}, dump $response;
my $source = get SERIALS_URL or die;
if ( $source =~ /\b\Q$serial\E\b/ ) {
print "Serial Found\n";
}
else{
print qq{Serial number "$serial" not found in our database};
}
答案 1 :(得分:-1)
您应该添加一些调试输出:
$serial
以检查是否正确读取。也许你需要成为root才能阅读它?$source
以检查文件是否已正确下载。您可能需要chomp $serial
来切断任何换行符后缀。
序列号可能包含RegEx特殊字符(例如. + * ( ) { } [ ] - ?
)。尝试
$ff = quotemeta($serial);
quotemeta
will escape all reserved chars
PS:无需将$serial
复制到$ff
。只是浪费内存和CPU时间,除非你改变它(比如使用quotemeta
)。您也不需要将" "
放在源代码中使用的变量周围。将它们与RegEx一起使用被认为是糟糕的风格。尝试
if ($source =~ /$ff/){