유닉스 쉘을 사용하여 호스트 이름에서 IP 주소를 얻는 쉬운 방법


12

호스트 이름에서 IP 주소를 얻는 가장 쉬운 방법은 무엇입니까?

나는 시도 ping하고 출력에서 ​​구문 분석 하는 것에 대해 생각하고있었습니다 . 그러나 이는 그리 좋지는 않으며 모든 시스템에서 동일한 방식으로 작동하지 않을 수 있습니다.

나는 약간의 주변을 검색하고로 솔루션을 찾았 nslookup지만의 호스트 이름에는 작동하지 않습니다 /etc/hosts.


아직도 유닉스 쉘이 프로그래밍 언어로 간주되지 않는 이유가 여전히 궁금합니다.
Albert Albert

쉘은 전통적으로 프로그래밍이 아니라 스크립팅으로 간주되기 때문에;)
Tino

답변:


5

표준 시스템 호출로이를 수행 할 수 있습니다. Perl의 예는 다음과 같습니다.

use strict; use warnings;
use Socket;
use Data::Dumper;

my @addresses = gethostbyname('google.com');
my @ips = map { inet_ntoa($_) } @addresses[4 .. $#addresses];
print Dumper(\@ips);

출력을 생성합니다.

$VAR1 = [
          '74.125.127.104',
          '74.125.127.103',
          '74.125.127.105',
          '74.125.127.106',
          '74.125.127.147',
          '74.125.127.99'
        ];

(명령 줄에서 다음과 같은 스크립트를 작성할 수 있습니다. perl -MSocket -MData::Dumper -wle'my @addresses = gethostbyname("google.com"); my @ips = map { inet_ntoa($_) } @addresses[4 .. $#addresses]; print Dumper(\@ips)')

다른 언어에서도 이와 유사하게이 작업을 수행 할 수 있습니다 man -s3 gethostbyname.


멋지다. Esp., perl -MSocket -MData::Dumper -wle'my @addresses = gethostbyname("www.google.com"); my @ips = map { inet_ntoa($_) } @addresses[4 .. $#addresses]; print $ips[0]'.
Albert Albert

이 답변이 일부 프로그램 코드라는 것이 매우 이상합니다 ... :) Stackoverflow 답변과 거의 같습니다. 실제로 Serverfault에 속하지 않습니다. 어쨌든 나는 대답을 받아 들일 것이다.
Albert Albert

@Albert : 공정해야합니다 : 1. 질문은 원래 SO에 게시되었고 SF로 ​​마이그레이션되었습니다. 2. 찾고있는 데이터의 유형을 무언가 로 파싱해야 합니다 . 어떤 사람들은 Perl을 더 나은 형태의 쉘 스크립트라고 생각합니다. : D
Ether

@Ether sed -e '/some people consider Perl a better form/s/better/worse/'SCNR
Tino

11

host <hostname>

전의:

serv ~ $ host stackoverflow.com
stackoverflow.com has address 69.59.196.211

편집하다

Linux (및 일부 OS X 변형)에서는 resolveipMySQL 서버 패키지의 일부인 을 사용할 수 있습니다 .

/etc/hosts:
 ...
 127.0.0.1     localhost localhost.localdomain foo
 ...

serv ~ $ resolveip foo
IP address of foo is 127.0.0.1

또한 작동하지 않습니다. (에있는 호스트의 경우 /etc/hosts)을 시도하십시오 host localhost.
Albert Albert

serv ~ $ host localhost \n localhost has address 127.0.0.1

흠, 여기가 아닙니다. 왜 이것이 당신에게 도움이되는지 궁금합니다. 또는 왜 그것이 나를 위해하지 않습니다.
Albert Albert

2
내 편집을 참조하십시오-시도해보십시오 resolveip.

흠, resolveip기본적으로 데비안에는 설치되어 있지 않습니다.
Albert Albert

9

이 고대 게시물에는 많은 창의적인 솔루션이있는 것 같습니다.

/etc/hosts액세스 권한이 있는지 확인 해야하는 경우 사용하는 경향이 있습니다.

getent hosts somehost.com

적어도`/etc/nsswitch.conf '가 파일을 사용하도록 설정되어 있다면 (정상적으로) 작동합니다.


좋고 IPv6에서도 작동합니다.
Tino

그리고 syslinux를 설치할 필요가 없습니다!
Claudiu

일부 IP의 경우 ahosts여러 줄 정보를 반환 하지만 아무것도 반환하지 않는다는 점에 흥미가 있습니다.
akostadinov

7

IPv4의 경우 / etc / hosts를 포함한 리졸버를 사용하여 기본적으로 작동하는 표준 프로그램이 있습니다.

host="localhost"
ip="`gethostip -d "$host"`"

데비안의 일부이므로 다음과 같이 설치하십시오 :

apt-get install syslinux

IPv6과 같은 IPv4 이외의 다른 프로토콜의 경우 현재 비슷한 도구를 모릅니다. 업데이트 : 이것 때문에 IPv6를 해결할 수있는 작은 도구를 작성했습니다.

https://github.com/hilbix/misc/blob/master/src/ipof.c

그것은 빠르고 더러운 쉘 사용을 위해 생각 gethostip되지만 IPv6도 허용합니다.

ip="`ipof -6 -- heise.de`"

또한 다음과 같이 대화식으로 사용할 수 있습니다.

ipof -a -d -x -v -h -

HTH


이 답변을 제공하기 위해 여기에 왔으며 대신 투표했습니다.
Not Now

4

왜 안돼 dig +short hostname?

(쿼리 DNS)


고려하지 않습니다 /etc/hosts.
Janne Pikkarainen의

DNS는 이름 확인을위한 결정적인 소스로 간주되며 호스트 파일을 사용하여 재정의하면 괜찮습니다. 그러나 그것은 결정적인 것이 아니라 재정의입니다.
gWaldo

:) 등 / 호스트 / I는 알고 있지만, 원래의 질문은 원
의 Janne Pikkarainen에게

충분히; 내 독해는 ... 실패
gWaldo

3

글쎄, 내 현재 솔루션 :

ping -c1 -n www.google.com | head -n1 | sed "s/.*(\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\)).*/\1/g"

이것은 IP 만 제공하지는 않습니다 : PING www.l.google.com (72.14.234.104) : 56 데이터 바이트
Federico klez Culloca

예, sed시스템마다 약간 다르게 동작하는 것 같습니다 . :) 얼마나 짜증나. 나는 조금 바꿨다. 지금 어디에서나 작동해야한다고 생각한다.
Albert Albert

0

일부 Unices에서는 다음이 작동합니다.

arp <hostname>

예를 들어 Mac OS X에서 나는 이것을 얻습니다.

arp My-iMac.local
My-iMac.local (192.168.1.2) -- no entry

글쎄, 항목을 찾았지만 IP가 아닌 MAC 만 나열합니다. :)
Albert Albert

아, arp -n hostnameIP를 보여줍니다.
Albert Albert

이 방법은 네트워크 외부의 서버에서는 작동하지 않습니다. : P
Albert Albert

0

ping일반적으로 의존성이 높지 않기 때문에 사용하는 것이 그렇게 나쁘지 않습니다.

Linux 시스템에서 사용한 기능은 다음과 같습니다.

getip () { ping -c 1 -t 1 $1 | head -1 | cut -d ' ' -f 3 | tr -d '()' ; }

-1
nmap -sP 192.168.1.0/24|grep SEARCHED_HOSTNAME|sed -n 's/.*[(]\([0-9\.]*\)[)].*/\1/p'
  • Nmap은 서브넷 (192.168.1.0 등)에서 주소를 가져옵니다.
  • grep을 사용하면 찾고있는 호스트 이름 줄만 가져옵니다.
  • sed를 사용하면 괄호 안에 IP 주소 만 가져옵니다.

2
다양한 스위치에 대한 자세한 정보와 사용 된 이유가 답변에 추가 될 것
Dave M

이 답변이 효과가없는 이유는 적어도 네 가지가 있습니다. 답을 찾을 수있는 IP 주소 범위에 대해 가정합니다. 필요한 것보다 훨씬 많은 네트워크 트래픽을 생성하기 때문에 비효율적입니다. 프로브에 응답하는 IP 주소에서만 작동합니다. 역방향 DNS에 정방향 DNS와 정확히 동일한 매핑이 포함되어 있다고 가정합니다.
kasperd
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.