我试图在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地址而不是设备名称。
答案 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;
}