获取Perl中的Bios序列号

时间:2016-05-08 07:52:57

标签: perl serialization

我想获取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的序列号被找到!!

2 个答案:

答案 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/){