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

时间:2010-11-04 20:47:23

标签: linux perl networking centos

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

例如:

  • eth0的IP为10.0.0.2网络掩码255.255.255.128

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

  • eth0.3的IP为10.0.1.2网络掩码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 个答案:

答案 0 :(得分: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 :(得分:6)

如果您需要纯粹的Perl解决方案,可以尝试IO::Interface。我以前在这方面取得了一些成功,文档很好。

答案 2 :(得分:4)

如何使用ifconfig?

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

答案 3 :(得分:1)

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

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