获取perl中的Bios序列号

获取perl中的Bios序列号,perl,serialization,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 "Se

我想获取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 有序列号列表


但是脚本总是给我抱歉,在我们的数据库中找不到序列号!!但是我的Bios的序列号被找到了

您应该添加一些调试输出:

打印$serial以检查其读取是否正确。也许你需要成为root才能阅读它? 打印$source以检查文件是否已正确下载。 您可能需要删除任何换行后缀

例如,序列号可能包含正则表达式特殊字符{ } [ ] - ?. 试一试

注:无需将$serial复制到$ff。只是浪费内存和CPU时间,除非您像使用quotemeta一样更改它。您也不需要在源代码中使用变量。将它们与正则表达式一起使用被认为是不好的风格。试一试

if ($source =~ /$ff/){

这里有几个问题,都与各种字符串的确切内容有关

WMIC命令不仅仅是返回61-1210-000747-00101111-071595-M747,因为它是用于命令行界面的,并且在该上下文中必须看起来很好

请注意,我不能直接测试,因为我的Windows系统是手工构建的,没有序列号

相反,它返回类似于

"SerialNumber  \r\n61-1210-000747-00101111-071595-M747\r\n\r\n"
在您的内部网上的serials.txt文件中搜索它几乎注定会失败。您需要使用类似这样的方法将序列号与周围的文本隔离开来

my $response = qx(wmic bios GET SerialNumber);
my ($serial) = $response =~ /^SerialNumber\s+(\S+)/;
使用正则表达式模式搜索intranet上serials.txt的内容也有问题。最好正确解析该文件的内容,但不显示它的外观

相反,您可以在regex模式中使用\Q…。\E,这样序列号中的任何regex元字符都会被逐字处理。您将需要在\b…\b中包围它,以便像123A这样的序列号不会被验证,因为它恰好是serials.txt文件中ABC-123AD-59F的子字符串

这应该对你有用

#!/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};
}

我尝试了'print$serial',输出为:SerialNumber NXV7VEM06332617BXXXXXX,但当我添加quotemeta函数时,输出变成:\SerialNumber\\\\\\\\\\\\\\\\\XV7VEM06332617BXXXXXX\\\\\\\字符串中似乎有一些无法打印的字符。尝试使用Data::Dumper查看发生了什么,或者尝试打印unpach*,$serial以获取字符串的十六进制表示形式,该字符串应该显示字符,可能是ASCII-0=\x00。您还可以使用正则表达式从该字符串中提取纯序列号,类似于$serial=~/serial\W+\W+/$ff=1美元;所需信息隐藏在某些布局文本中,Windows的CR LF作为行终止符。使用正则表达式进行提取非常简单,但没有必要对其使用随机运算符。chomp和quotemeta都帮不上忙谢谢你兄弟^_^
#!/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};
}