gpt4 book ai didi

mysql - 用于检查网络的 Perl 脚本

转载 作者:行者123 更新时间:2023-11-28 23:37:15 25 4
gpt4 key购买 nike

我是 Perl 的新手,为了练习,我正在编写一个简单的 perl 脚本来检查我的家庭网络是否有可用的 ip 地址,并检查它们的 mac 地址、供应商和打开的端口。我想放入 mysql 数据库的所有信息。这是我的代码:

#!/usr/local/bin/perl
use strict;
use warnings;
use Net::Ping;
use Net::ARP;
use DBI;
use IO::Socket::PortState qw(check_ports);
require config;
my $proto = 'tcp';
my @ports = (21,22,23,80,8080);
my $address;
my $ping_timeout = 1;
my $host;
for my $i (18..21)
{
$host = "10.20.1.$i";
my $timeout = 1;
my $pinger = Net::Ping->new('icmp', $timeout);
print "$host ";
if ($pinger->ping($host))
{
my $mac = Net::ARP::arp_lookup("em0","$host");
my $vendor = vendor_lookup($mac);
$vendor=~ s/^\s+|\s+$//g;
print "$mac $vendor ";
foreach my $port (@ports)
{
my($section, $ping_timeout, %porthash);
$porthash{$proto}{$port}{'name'} = $section;
check_ports($host, $ping_timeout, \%porthash);
my $open = $porthash{$proto}{$port}{'open'};
if ($open) {
print "$port ";
}
}
print "\n";
}
}

如果我运行脚本,我会收到类似的信息:

10.20.1.18  38:ea:a7:6f:d9:05  Hewlett Packard  80 8080 
10.20.1.19 fc:15:b4:31:77:76 Hewlett Packard 80 8080
10.20.1.20 e8:39:35:25:dd:36 Hewlett Packard 22 80

我的问题是,我似乎找不到如何组合所有信息($host、$mac、$vendor、$port)并将其放入数据库的答案,因为如果我们将 $port 变量放入@array 它将具有与其他数组不同的大小。

我的数据库结构是这样的:

+----+------------+-------------------+--------------+-----------------+---------------------+
| id | ip | mac | opened_ports | vendor | date |
+----+------------+-------------------+--------------+-----------------+---------------------+
| 1 | 10.20.1.19 | fc:15:b4:31:77:76 | NULL | Hewlett Packard | 2016-02-15 15:50:19 |
| 2 | 10.20.1.20 | e8:39:35:25:dd:36 | NULL | Hewlett Packard | 2016-02-15 15:50:19 |
| 3 | 10.20.1.21 | 8c:dc:d4:5d:21:7b | NULL | Hewlett Packard | 2016-02-15 15:50:19 |
| 4 | 10.20.1.18 | 38:ea:a7:6f:d9:05 | NULL | Hewlett Packard | 2016-02-15 16:02:09 |
| 5 | 10.20.1.19 | fc:15:b4:31:77:76 | NULL | Hewlett Packard | 2016-02-15 16:02:09 |
| 6 | 10.20.1.20 | e8:39:35:25:dd:36 | NULL | Hewlett Packard | 2016-02-15 16:02:10 |
| 7 | 10.20.1.21 | 8c:dc:d4:5d:21:7b | NULL | Hewlett Packard | 2016-02-15 16:02:10 |
+----+------------+-------------------+--------------+-----------------+---------------------+

这是导入的信息,没有开放端口的信息。

最佳答案

Your database is not normalized .您有一个基本的 1:N 关系,其中每一行可以有零个或多个 opened_ports

处理该问题的正确方法是创建第二个表,每个 id 有 N 行。它看起来像这样:

+-------+--------------+
| id_fk | opened_ports |
+-------+--------------+
| 1 | 22 |
| 1 | 80 |
| 3 | 22 |
+-------+--------------+

然后从主表中删除列 opened_ports,并通过 id 链接它们。

在您的 Perl 程序中,您现在需要执行两次插入操作。第一个用于大表,它也将创建您的(可能是 auto_increment)id。您可以通过调用 $dbh->last_insert_id 来获取它.之后,您可以使用它在保存端口的小表上执行后续的第二个插入语句(或组合语句)。

关于mysql - 用于检查网络的 Perl 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35436742/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com