脚本来操纵dhcp / conf

时间:2009-01-10 20:54:49

标签: bash shell

我想编写一个脚本来操作dhcp.conf文件。从某种意义上说,它必须读取文件并且它应该ping所有租约IP并且应该给出另一个文本文件,其中它应该给出IP列表,现在存在哪些设备。

编辑:谢谢你的快速回复。 dhcpd.conf文件是这样的

lease 172.31.0.10 {
  some text
  some text1
}

lease 172.31.0.12 {
  some text
  some text1
}

lease 172.31.0.100 {
  some text
  some text1
}

所以首先我需要先提取ip地址,然后逐个提取

2 个答案:

答案 0 :(得分:1)

假设

首先,您需要注意两件事:

  • 并非所有设备都响应ping。相当多的PC防火墙禁用 ping回复。如果您使用以太网,则可以使用arping代替 甚至会检测防火墙的PC。
  • dhcpd将文件中的租约留在/知道/不再有效。

所以,这是一个例子:

lease 192.168.66.132 {
  starts 4 2009/01/08 23:58:41;
  ends 5 2009/01/09 00:00:41;
  binding state free;
  hardware ethernet 00:e0:81:28:2d:56;
}
lease 192.168.66.133 {
  starts 5 2009/01/09 03:17:17;
  ends 2 2038/01/19 03:14:06;
  binding state active;
  next binding state free;
  hardware ethernet 00:e0:81:28:2d:57;
}

你可以看到132没有被使用(binding state free)而133是 (binding state active)。另一种可能性是binding state backup, 但这只发生在故障转移配置中。

租约也可以放弃,这意味着DHCP服务器是 要分配该IP,但发现它已经在使用中(通过ping)。

dhcpd.leases(5)中记录了这一切。

你为什么要这个?

  1. DHCP服务器已经重新使用过期的租约。有没有好处 你需要检查它的工作原因?如果你的时间不多了 租约,你考虑过降低租约时间吗?

  2. nmap -sP <start_ip>-<end_ip>能做你需要的吗?那也是 检测具有静态IP地址的计算机。

  3. 重写问题

    所以,鉴于上述情况,并假设你仍然想要这个,我会去 回答这个问题:

      

    请写一个脚本来查找所有活动或租赁的租约   放弃并确定当前是否有使用该IP的机器   地址。

    所以:

    #!/usr/bin/perl
    use File::Slurp qw(slurp);
    use Data::Dump qw(pp);
    use strict;
    
    1 == @ARGV
        or die "Usage: $0 dhpcd.leases\n";
    my $leases = slurp($ARGV[0]);
    $leases =~ s/^#.*\n//mg;
    my @leases = split(/lease (\d.+\d.+\d.+\d+) {/, $leases);
    shift @leases;
    my %lease = @leases;
    
    while (my ($ip, $rec) = each %lease) {
        print $ip;
        $rec =~ /^\s*abandoned;\s*$/m and print " abandoned";
        $rec =~ /^\s*binding state free;\s*$/m and print " free";
        $rec =~ /^\s*binding state active;\s*$/m and print " active";
        print "\n";
    }
    

    这个相对丑陋的perl脚本会给你输出:

    192.168.66.132 free
    192.168.66.133 active
    

    你应该很容易为arping提供食物。

答案 1 :(得分:0)

问题是,绑定状态有效; 并不意味着,设备处于活动状态。要确保设备处于活动状态,我们需要先ping设备。我们没有其他办法可以做到这一点