Bash 스크립트에서 호스트 이름을 IP 주소로 확인하려면 어떻게해야합니까? 스크립트에서 호스트

Bash 스크립트에서 호스트 이름을 IP 주소로 확인하는 가장 간결한 방법은 무엇입니까? 내가 사용하고 아치 리눅스를 .



답변

getent와 함께 제공되는을 사용할 수 있습니다 glibc(따라서 Linux에서 거의 사용할 수 있습니다 ). 이것은 gethostbyaddr / gethostbyname2를 사용하여 해결되므로 /etc/hosts/ NIS / etc 도 확인합니다 .

getent hosts unix.stackexchange.com | awk '{ print $1 }'

또는 Heinzi가 아래에서 말했듯 dig+short인수 와 함께 사용할 수 있습니다 (DNS 서버를 직접 쿼리하고 /etc/hosts/ NSS / etc를 보지 않음 ).

dig +short unix.stackexchange.com

dig +short사용할 수없는 경우 다음 중 하나가 작동합니다. 이러한 모든 쿼리는 DNS를 직접 쿼리하고 다른 해결 방법은 무시합니다.

host unix.stackexchange.com | awk '/has address/ { print $4 }'
nslookup unix.stackexchange.com | awk '/^Address: / { print $2 }'
dig unix.stackexchange.com | awk '/^;; ANSWER SECTION:$/ { getline ; print $5 }'

하나의 IP 만 인쇄하려면 해당 exit명령을 awk워크 플로에 추가하십시오 .

dig +short unix.stackexchange.com | awk '{ print ; exit }'
getent hosts unix.stackexchange.com | awk '{ print $1 ; exit }'
host unix.stackexchange.com | awk '/has address/ { print $4 ; exit }'
nslookup unix.stackexchange.com | awk '/^Address: / { print $2 ; exit }'
dig unix.stackexchange.com | awk '/^;; ANSWER SECTION:$/ { getline ; print $5 ; exit }'


답변

host로부터 dnsutils의 패키지 :

$ host unix.stackexchange.com
unix.stackexchange.com has address 64.34.119.12

( 설명에 따라 패키지 이름이 수정되었습니다 . 참고로 다른 배포판에는 host다른 패키지가 있습니다. Debian / Ubuntu bind9-host , openSUSE bind-utils , Frugalware bind .)


답변

내 컴퓨터에 작업을 수행하는 것처럼 보이는 도구가 있습니다. 맨 페이지에는 mysql과 함께 제공되는 것 같습니다 … 다음은 사용 방법입니다.

resolveip -s unix.stackexchange.com
64.34.119.12

호스트 이름을 확인할 수없는 경우이 도구의 반환 값은 0과 다릅니다.

resolveip -s unix.stackexchange.coma
resolveip: Unable to find hostid for 'unix.stackexchange.coma': host not found
exit 2

업데이트
fedora에서는 mysql-server와 함께 제공됩니다.

yum provides "*/resolveip"
mysql-server-5.5.10-2.fc15.x86_64 : The MySQL server and related files
Dépôt         : fedora
Correspondance depuis :
Nom de fichier      : /usr/bin/resolveip

나는 그것이 당신의 스크립트에 이상한 의존성을 만들 것이라고 생각합니다 …


답변

다음 명령을 사용 dig하면 sed / awk / etc없이 결과를 직접 읽을 수 있습니다. 마법:

$ dig +short unix.stackexchange.com
64.34.119.12

digdnsutils패키지에 포함되어 있습니다.


참고 : 이름을 확인할 수없는 경우에도 dig반환 값은 0입니다. 따라서 반환 값을 확인하는 대신 출력이 비어 있는지 확인해야합니다.

hostname=unix.stackexchange.com

ip=`dig +short $hostname`

if [ -n "$ip" ]; then
    echo IP: $ip
else
    echo Could not resolve hostname.
fi

참고 2 : 호스트 이름에 여러 개의 IP 주소가있는 경우 ( debian.org예 : try ) 모든 호스트 주소 가 반환됩니다. 이 “문제”는 지금까지이 질문에 언급 된 모든 도구에 영향을줍니다.


답변

getent hosts unix.stackexchange.com | cut -d' ' -f1


답변

지금까지 제공된 솔루션은 대부분 더 간단한 경우에 작동합니다. 호스트 이름은 단일 IPv4 주소로 직접 확인됩니다. 이것은 호스트 이름을 해결해야하는 유일한 경우 일 수 있지만 그렇지 않은 경우 아래에서 처리해야 할 경우에 대한 설명입니다.

Chris Down과 Heinzi는 호스트 이름이 둘 이상의 IP 주소로 확인되는 경우에 대해 간단히 설명했습니다. 이 경우 (및 아래의 다른 경우) 호스트 이름이 단일 IP 주소로 직접 확인된다는 가정하에 기본 스크립팅이 중단 될 수 있습니다. 아래는 호스트 이름이 하나 이상의 IP 주소로 확인되는 예입니다.

$ host www.l.google.com
www.l.google.com has address 209.85.148.147
www.l.google.com has address 209.85.148.103
www.l.google.com has address 209.85.148.99
www.l.google.com has address 209.85.148.106
www.l.google.com has address 209.85.148.105
www.l.google.com has address 209.85.148.104

그러나 무엇 www.l.google.com입니까? 이 경우 별칭 케이스를 소개해야합니다. 아래 예를 확인하십시오.

$ host www.google.com
www.google.com is an alias for www.l.google.com.
www.l.google.com has address 74.125.39.103
www.l.google.com has address 74.125.39.147
www.l.google.com has address 74.125.39.105
www.l.google.com has address 74.125.39.99
www.l.google.com has address 74.125.39.106
www.l.google.com has address 74.125.39.104

따라서 www.google.comIP 주소로 직접 해석되지는 않지만 여러 IP 주소로 자체 해석되는 별명으로 해석됩니다. 별칭에 대한 자세한 내용은 여기를 확인 하십시오 . 물론, 아래와 같이 별명이 단일 IP 주소를 갖는 경우도 가능합니다.

$ host g.www.ms.akadns.net
g.www.ms.akadns.net is an alias for lb1.www.ms.akadns.net.
lb1.www.ms.akadns.net has address 207.46.19.190

그러나 별칭을 연결할 수 있습니까? 대답은 ‘예’입니다.

$ host www.microsoft.com
www.microsoft.com is an alias for toggle.www.ms.akadns.net.
toggle.www.ms.akadns.net is an alias for g.www.ms.akadns.net.
g.www.ms.akadns.net is an alias for lb1.www.ms.akadns.net.
lb1.www.ms.akadns.net has address 207.46.19.254

$ host www.google.fr
www.google.fr is an alias for www.google.com.
www.google.com is an alias for www.l.google.com.
www.l.google.com has address 74.125.39.147
www.l.google.com has address 74.125.39.103
www.l.google.com has address 74.125.39.99
www.l.google.com has address 74.125.39.106
www.l.google.com has address 74.125.39.104
www.l.google.com has address 74.125.39.105

호스트 이름이 IP 주소로 확인되지 않는 별칭으로 확인되는 예를 찾지 못했지만 문제가 발생할 수 있다고 생각합니다.

여러 개의 IP 주소 및 별칭보다 더 특별한 경우가 있습니까? IPv6는 어떻습니까? 시도해 볼 수 있습니다 :

$ host ipv6.google.com
ipv6.google.com is an alias for ipv6.l.google.com.
ipv6.l.google.com has IPv6 address 2a00:1450:8007::68

여기서 호스트 이름 ipv6.google.com은 IPv6 전용 호스트 이름입니다. 이중 스택 호스트 이름은 어떻습니까?

$ host www.facebook.com
www.facebook.com has address 66.220.153.15
www.facebook.com has IPv6 address 2620:0:1c08:4000:face:b00c::

다시 IPv6에 대해, 호스트가 IPv4 전용 인 경우에도 IPv6 주소를 확인할 수 있습니다 (IPv4 전용 WinXP 및 ipv6.google.com에서 테스트 한 경우 Linux에서 시도 할 수 있음). 이 경우 해결에 성공하지만 알 수없는 호스트 오류 메시지 와 함께 핑이 실패 합니다 . 스크립팅이 실패하는 경우 일 수 있습니다.

그 말이 도움이 되었기를 바랍니다.


답변

별명에 대한 문제점을 피하고 항상 사용할 단일 IP 주소를 확보하려면 다음을 수행하십시오.

python -c 'import socket; print socket.gethostbyname("www.example.com")'