首页 文章

如何在Perl中找到每个接口的IP地址?

提问于
浏览
3

我试图在linux盒子上找到一个IP地址列表 . 目前我的设置是CentOS机器,每个VLAN都有几个用于eth0的子接口 . 我正在编写一个脚本,以查看每个VLAN IP地址是否与某些IP地址(每个网络的不同IP地址)连接 .

例如:

  • eth0的IP为10.0.0.2 netmask 255.255.255.128

  • eth0.2的IP为10.0.130网络掩码255.255.255.128

  • eth0.3的IP为10.0.1.2 netmask 255.255.255.128

每个接口当前通过配置文件设置为静态IP地址 . 但是,我想将它从静态更改为DHCP并获得相同的IP地址 . 如果我这样做,它将破坏脚本的这一部分:

@devarray = `cat /etc/sysconfig/network-scripts/ifcfg-eth0* | grep IPADDR=10 -B 10 | grep -v "#" | grep IPADDR`;

有没有更好的方法来确定可用的IP地址 . 我需要收集的只是IP地址而不是设备名称 .

4 回答

  • 4

    如果你想要一个纯粹的Perl解决方案,你可以试试IO::Interface . 我以前在这方面取得了一些成功,而且文档很好 .

  • 7

    Net::Interface,这似乎在我的系统上给了我很好的结果:

    my %addresses = map { 
          ($_ => [
              map { Net::Interface::inet_ntoa($_) } # make addresses readable
                  $_->address,                      # all addresses
          ]);
    } Net::Interface->interfaces;                   # all interfaces
    

    这将返回类似的东西

    (
      eth0 => [],
      eth1 => [ '192.168.2.100' ],
      lo   => [ '127.0.0.1' ]
    )
    

    更新:应该提到:检查文档中的 address 以外的方法以获取每个接口的其他信息 .

  • 1

    使用ifconfig怎么样?

    my @ips = (`ifconfig -a` =~ /inet addr:(\S+)/g);
    
  • 6

    我认为以下方法是最可靠且与环境无关的 . 但只有在知道接口名称时才有用 .

    #!/usr/bin/perl
    use strict;
    use warnings;
    use Socket;
    require 'sys/ioctl.ph';
    
    print get_interface_address('eth0');
    
    sub get_interface_address
    {
        my ($iface) = @_;
        my $socket;
        socket($socket, PF_INET, SOCK_STREAM, (getprotobyname('tcp'))[2]) || die "unable to create a socket: $!\n";
        my $buf = pack('a256', $iface);
        if (ioctl($socket, SIOCGIFADDR(), $buf) && (my @address = unpack('x20 C4', $buf)))
        {
            return join('.', @address);
        }
        return undef;
    }
    

    在这里找到:http://snipplr.com/view/46170/the-most-reliable-and-correct-method-to-get-network-interface-address-in-linux-using-perl/

相关问题