Linux host
명령은 다음을 반환합니다.
hostA.domain.com has address xx.xxx.xxx.xx
$ipaddr
IP 주소를 어떻게 가져와서 변수 에 넣나요 ?
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;
}
답변1
StackOverflow가 아닌 Unix 및 Linux 사이트에 이 내용을 게시하셨으므로 다음과 같은 내용이 귀하가 찾고 있는 것이 아닌지 궁금합니다.
cat hostlist.txt | xargs resolveip -s
그러나 이는 IP 주소만 반환합니다.
일부 호스트 이름에는 여러 IP 주소가 연결되어 있습니다.
$ 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
IP 목록만 얻으려면 다음 중 한 가지 방법을 사용하세요.
host <hostname> | grep "has address" | awk '{print $4}'
Perl을 계속 사용하려면, resolvip을 사용하십시오:
$ipaddr = qx(resolveip -s $hostname);
또는 쉘 명령을 실행하지 않고 모든 IP를 얻으십시오.
use Socket;
@ipaddrs = map { inet_ntoa($_) } (gethostbyname($hostname))[4,];
답변2
왜 그냥 사용하지 않습니까 dig +short
?
답변3
나는 다음과 같은 것을 사용할 것입니다 :
(\d{1,3}\.){3}\d{1,3}
좀 더 엄격한 것을 원한다면 다음과 같이 할 수 있습니다.
([012]?\d{1,2}\.){3}[012]?\d{1,2}
하지만 그럼에도 불구하고 여전히 조금 느슨합니다. 예를 들어 "269.278.287.296"의 잘못된 일치는 여전히 허용됩니다.
그러나 둘 다 표준 0.0.0.0 ~ 255.255.255.255를 준수합니다.
답변4
@mkopala의 답변에 추가하려면 호스트가 여러 개 있고 이를 추적하려면 호스트와 IP 매핑을 쉽게 참조할 수 있도록 해시를 구축하세요.
예:
#!/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,];
}