Extrai o endereço IP de uma string

2

O comando Linux host retorna:

hostA.domain.com has address xx.xxx.xxx.xx

Como faço para obter apenas o endereço IP e colocá-lo na variável $ipaddr ?

open(FILE, "hostlist.txt") or die("Unable to open file");
@hostnames = <FILE>;
close(FILE);
foreach $hostname (@hostnames)
{
    $lookup = qx(host $hostname);
    $ipaddr = grep ip_address $lookup;  <---- need help here
    print $ipaddr;
}
    
por user11496 04.01.2012 / 04:12

4 respostas

5

Desde que você postou isso no Unix & Site Linux, em vez de StackOverflow, eu estou querendo saber se algo como isto não é o que você está procurando:

cat hostlist.txt | xargs resolveip -s

Isso só retornará um endereço IP.

Alguns nomes de host terão vários endereços IP associados a eles:

$ host www.google.com
www.google.com is an alias for www.l.google.com.
www.l.google.com has address 74.125.227.18
www.l.google.com has address 74.125.227.17
www.l.google.com has address 74.125.227.16
www.l.google.com has address 74.125.227.20
www.l.google.com has address 74.125.227.19

Para obter apenas a lista de IPs, uma maneira de fazer isso é:

host <hostname> | grep "has address" | awk '{print $4}'

Se você quiser ficar com Perl, usando resolveip:

$ipaddr = qx(resolveip -s $hostname);

Ou para obter todos os IPs, sem executar comandos de shell:

use Socket;
@ipaddrs = map { inet_ntoa($_) } (gethostbyname($hostname))[4,];
    
por 04.01.2012 / 05:39
3

Por que não usar apenas dig +short ?

    
por 04.01.2012 / 05:07
1

Eu usaria algo como:

(\d{1,3}\.){3}\d{1,3}

Se você quiser algo mais exigente, provavelmente terá:

([012]?\d{1,2}\.){3}[012]?\d{1,2}

Mas mesmo isso ainda é um pouco solto. Por exemplo, ainda permite que '269.278.287.296' corresponda falsamente.

Mas ambos correspondem ao padrão de 0.0.0.0 a 255.255.255.255.

    
por 04.01.2012 / 04:56
0

Para adicionar a resposta do @mkopala, se você tiver vários hosts e quiser acompanhá-los, construir um hash, para que haja uma referência fácil do host ao mapeamento ip.

Exemplo:

#!/usr/bin/perl
use Socket;
@hostnames = ('www.google.com', 'www.yahoo.com', 'www.facebook.com');
%ipaddrs = ();
foreach $hostname (@hostnames) {
        map { $ipaddrs{$hostname} = inet_ntoa($_) } (gethostbyname($hostname))[4,];
}
    
por 14.01.2012 / 12:16