Как я могу найти IP-адреса для каждого интерфейса в Perl? - PullRequest
3 голосов
/ 04 ноября 2010

Я пытаюсь найти список IP-адресов в окне Linux. В настоящее время моя установка представляет собой машину CentOS с несколькими подинтерфейсами для eth0 для каждой VLAN. Я пишу сценарий, чтобы увидеть, имеет ли каждый IP-адрес VLAN возможность подключения к определенным 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 ]

7 голосов
/ 05 ноября 2010

Существует 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, чтобы получить другую информацию для интерфейса.

6 голосов
/ 05 ноября 2010

Если вам нужно чистое Perl-решение, вы можете попробовать IO :: Interface . Я имел некоторый успех с этим в прошлом, и документация хорошая.

4 голосов
/ 04 ноября 2010

Как насчет использования ifconfig?

my @ips = (`ifconfig -a` =~ /inet addr:(\S+)/g);
1 голос
/ 01 января 2011

Я думаю, что следующий метод является наиболее надежным и независимым от окружающей среды. Но полезно, только если вы знаете имя интерфейса.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...