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


416

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


21
getent <ahosts|ahostsv4|ahostsv6|hosts> <hostname>답이 바닥 근처 어딘가에 있다는 것을 부끄러운 일입니다 . 가장 간단하고 추가 패키지가 필요 없으며 Bash 스크립트에서 구문 분석 하기더 쉽습니다 .
0xC0000022L

1
@ 0xC0000022L : 새로운 수치는 그 대답이 시사하는 것입니다 getent hosts somehost때, 이 실행 에 동안somehost IPv6 주소를 생성 할 것이다 대부분의 다른 도구 (방법과 다른, ping, ssh적어도) 이름을 확인을하고, 몇 가지를 나누기. ahosts대신에 사용하십시오 hosts.
j_random_hacker 12

@j_random_hacker : 누가 IPv4 ( ahostsv4) 또는 IPv6 ( ahostsv6) 주소 를 구체적으로 요청하지 못하게 합니까? 개인적으로 IPv6을 반환하는 비 특정 요청에는 아무런 문제가 없습니다. 코드를 준비해야합니다. IPv6는 현재 20 년 이상 존재 해 왔습니다.
0xC0000022L

@ 0xC0000022L : 아무도 그런 일을 " hosts지키지"않습니다. 그러나 그 대답은 구체적으로 암시합니다 . 지금까지 4 명이 "갑자기 IPv6"으로 인한 고통을 나타내는 vinc17의 의견을지지했습니다. IPv6을 준비하는 것이 항상 문제가되는 것은 아닙니다. 많은 프로그램이 두 개의 이름 / 주소가 동일한 호스트를 참조하는지 여부를 판별하는 방법이 필요합니다. 간단한 문자열 일치를 사용하거나 "true"답변을 찾으려면 네트워크에 대해 많이 알고 있어야합니다. 후자는 지뢰밭이므로 제어 할 수없는 많은 타사 프로그램 및 시스템이 전자를 사용합니다.
j_random_hacker

답변:


533

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 }'

2
기본적으로 dig 사용은 ipv4에서만 작동하며 여기서 host는 ipv4 및 ipv6 응답을 모두 제공합니다. 예상치 못한 결과 일 수 있습니다. 당신이 시도 할 수 host www.google.com, dig +short www.google.com, host ipv6.google.com, dig +short ipv6.google.com, host www.facebook.com, dig +short www.facebook.com.
jfg956

6
DIG가 작동하지 않습니다. CNAME 인 경우 IP를 반환하지 않습니다.
sorin

4
때로는 host시간이 초과되어 아무 것도 반환하지 않을 수 있습니다. 일부 도메인의 dig +short경우 첫 번째 줄에 도메인 별칭이 반환 될 수 있습니다. 따라서 출력이 IPv4 주소인지 확인하려면을 사용하십시오 dig +short example.com | grep -Eo '[0-9\.]{7,15}' | head -1.
caiguanhao 2016 년

9
getent hosts <host>예를 들어 IPv6이 작동하지 않는 동안 IPv6 주소를 제공 할 수 있으므로 사용 이 올바르지 않습니다. 올바른 해결책은 getent ahosts <host>필요한 경우 IPv6 및 IPv4를 모두 사용 하는 것입니다.
vinc17

5
언급 할만한 가치 : host, dig 및 nslookup은 resolv.conf에 나열된 서버와 직접 통신하는 것처럼 보이지만 "getent hosts"는 활성화 된 경우 로컬 호스트 파일과 라이브러리 수준 캐싱 (예 : nscd)을 모두 존중합니다.
Saustrup

141

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 .)


4
dnsutils 을 의미 했습니까 ? 어쨌든, 잘 host했습니다, 고마워
Eugene Yarmash

당신 말이 맞을 것입니다. 확인할 아치가 없습니다. (나중에 이것을 언급하는 의견을 첨부하려고했지만, 대답은 이미
공표되었으므로

1
DNS에없는 것을 해결해야하는 경우 아래의 resolveip 항목을 참조하십시오 (예 : / etc / hosts)
Gavin Brock

2
host때때로 다중 라인 출력 (리디렉션의 경우)을 반환 한다는 점에 유의하십시오 host unix.stackexchange.com | tail -n1. IP 주소를 가진 라인 만 원한다면 원할 것입니다.
Edward Coffey

3
이 답변은 진지한 다운 보트가 필요합니다. host은 DNS 도구 (와 유사 nslookup)이므로 DNS가 아닌 호스트 만 검색합니다 (예 :) /etc/hosts. 따라서 OP의 질문에 대한 답변 이 아닙니다 .
peterh

54

내 컴퓨터에 작업을 수행하는 것처럼 보이는 도구가 있습니다. 맨 페이지에는 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

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


6
이것은 리졸버에서 OS의 빌드를 사용하는 유일한 솔루션 인 것 같습니다-DNS뿐만 아니라 / etc / hosts에서도 작동합니다.
Gavin Brock

8
getent다른 답변에 자세히 설명 된 것처럼 / etc / hosts 도보 고 glibc와 함께 제공되므로 Linux 시스템에 대한 종속성이 없습니다.
Asfand Qazi

44

다음 명령을 사용 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 ) 모든 호스트 주소 가 반환됩니다. 이 "문제"는 지금까지이 질문에 언급 된 모든 도구에 영향을줍니다.


2
도메인에 CNAME 항목이 있으면 도메인이 IP 주소 대신 첫 번째 줄에 인쇄 될 수 있습니다.
pcworld

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

4
또한 고려 ahosts, ahostsv4, ahostsv6getent.
0xC0000022L

cut\t열을 분리 하는 데 사용되는 getent 's에는 적합하지 않습니다 . 이것은 Solaris의 경우입니다.
9

1
@ceving : Solaris에서 (기본값 은 delimiter) cut없이 실행해야합니다 . Linux에서는 공백이므로 위의 줄이 작동합니다. -d\t
sborsky

27

지금까지 제공된 솔루션은 대부분 더 간단한 경우에 작동합니다. 호스트 이름은 단일 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에서 시도 할 수 있음). 이 경우 해결에 성공하지만 알 수없는 호스트 오류 메시지 와 함께 핑이 실패 합니다 . 스크립팅이 실패하는 경우 일 수 있습니다.

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


2
스크립팅에서 다루고 싶은 모든 주요 사례를 보여주는 수용 된 답변을 보완하는 것입니다. 내 버전 host에는 내 상자에 "주소가 있습니다"라고 표시되어 있지 않습니다.
Mihai Danila 2013


18
ping -q -c 1 -t 1 your_host_here | grep PING | sed -e "s/).*//" | sed -e "s/.*(//"

다른 시스템 및 / etc / hosts에 지정된 호스트에 대한 종속성없이 작동


2
ping을 사용하는 것은 hosts 파일의 값이 필요하지만 sed 패턴이 올바르게 구문 분석 되었기 때문에 필요한 것입니다. ping -q -c 1 -t 1 your_host_here | grep PING | SED -e "S / ^ [^ (* [(] //"| "의 /[)].*$//"-e 나오지도
ManiacZX

1
myhostname.local과 같은 내 홈 네트워크에서 무언가를 해결하려면 이것이 가장 효과적입니다.
Matt Friedman

1
나는 이것을 또한 제안 할 수있다 :ping -q -c 1 -t 1 bahface.local | grep -m 1 PING | cut -d "(" -f2 | cut -d ")" -f1
Matt Friedman

getent <ahosts|ahostsv4|ahostsv6|hosts> <hostname>내부 선언 작동 /etc/hosts, 너무 ... 그리고 그건 시스템 데이터베이스 (passwd를, 그룹, 별명, 서비스)의 모든 종류의 이동 - 투 - 도구.
0xC0000022L

17

간단하지만 유용합니다.

  1. getent ahostsv4 www.google.de | grep STREAM | head -n 1 | cut -d ' ' -f 1
  2. getent ahostsv6 www.google.de | grep STREAM | head -n 1 | cut -d ' ' -f 1
  3. getent hosts google.de | head -n 1 | cut -d ' ' -f 1

호스트가 여전히 존재하면 모든 명령은 IP 주소를 확인합니다. 호스트가 CNAME을 가리키면이 경우 IP도 얻게됩니다.

첫 번째 명령은 확인 된 IPv4 주소를 반환합니다

두 번째 명령은 확인 된 IPv6 주소를 반환합니다

세 번째 명령은 소유자가 선호하는 주소 인 IPv4 또는 IPv6 주소를 반환합니다.


가장 간단한 것입니다. 그리고 기본적으로 가능합니다. 좋아하지 host의 설치 필요하다는bindutils
michaelbn

7

다음은 ping"알 수없는 호스트"를 고려하고 (stderr를 통한 파이프 연결) 정규식 사용 tr을 피하기 위해 사용 하는 접근 방식 의 일부 변형입니다 sed.

ping -c1 -t1 -W0 www.example.com 2>&1 | tr -d '():' | awk '/^PING/{print $3}'

종료 값을 캡처하는 것이 중요한 경우에는 다음과 같이 작동합니다 (아주 우아하지는 않음).

ping -c1 -t1 -W0 www.example.com &>/dev/null && ping -c1 -t1 -W0 www.example.com 2>&1 | tr -d '():' | awk '/^PING/{print $3}'

추가 도구없이 작동하기 때문에이 솔루션을 좋아합니다.
Radon8472

7

Chris Down의 답변을 완성하고 (연쇄 적으로 연결된) 별칭에 대한 jfgagne 의견을 해결하려면 다음과 같은 해결책이 있습니다.

  • 여러 개의 IP를 고려
  • 하나 이상의 별칭 (CNAME)을 고려합니다.
  • /etc/hosts파일을 쿼리하지 않습니다 (제 경우에는 원하지 않았습니다). 그것을 쿼리하기 위해 dbernt의 python 솔루션은 완벽합니다)
  • awk / sed를 사용하지 않습니다

    dig +short www.alias.com  | grep -v "\.$" | head -n 1

항상 첫 번째 IP 주소를 반환하거나 해결되지 않은 경우 비어있는 트링을 반환합니다. 발굴 버전 :

    $ dig -v
    DiG 9.8.1-P1

1
다른 답변은 "dig + short"가 항상 단일 IP 주소를 반환 한다고 가정 합니다. 그들은 CNAME을 설명하지 않았습니다.
jamshid

5
 php -r "echo gethostbyname('unix.stackexchange.com');"

이것은 작동하지만, PHP가 터미널에 설치되어 있어야합니다
Radon8472

1
"호스트"등 "파고"사용할 수없는 경우 일반적인 PHP는 고정 표시기 컨테이너에 유용 할 수 있습니다
파비안 Schmengler

5

Andrew McGregor Re : ping의 의견으로 이것을 추가하고 싶었습니다. 그러나 그것은 나를 허락하지 않을 것이므로 이것을 다른 대답으로 추가해야합니다. (누군가가 댓글로 의견을 옮길 수 있다면 자유롭게 느끼십시오.)

이것은 ping과 grep 만 사용하는 또 다른 변형입니다.

ping -q -c1 -t1 your_host_here | grep -Eo "([0-9]+\.?){4}"

grep -E정규 표현식을 확장 grep -o하고 일치하는 부분 만 반환합니다. 정규 표현식 자체는 하나 또는 여러 자릿수 ( [0-9]+)와 선택적으로 점 ( \.?)을 네 번 찾습니다 ( {4})


4

당신은 사용할 수 있습니다 host:

hostname=example.org

# strips the IP
IP=$( host ${hostname} | sed -e "s/.*\ //" )

# checks for errors
if [ $? -ne 0 ] ; then
   echo "Error: cannot resolve ${hostname}" 1>&2
   exit 1;
fi

4

다음은 다른 사람들의 대답을 사용하여 요리 한 배쉬 레시피입니다. 먼저 시도 /etc/hosts하고 nslookup으로 넘어갑니다.

resolveip(){
    local host="$1"
    if [ -z "$host" ]
    then
        return 1
    else
        local ip=$( getent hosts "$host" | awk '{print $1}' )
        if [ -z "$ip" ] 
        then
            ip=$( dig +short "$host" )
            if [ -z "$ip" ]
            then
                echo "unable to resolve '$host'" >&2 
                return 1
            else
                echo "$ip"
                return 0
            fi
        else
            echo "$ip"
            return 0
        fi
    fi
}

명확하게하기 위해, getent hosts/ etc / hosts 파일에서 바로 조회하지 않습니다 - 그건 풀에 대한 DNS-해결 호출에 gethostbyaddr에 (3) , 그리고 그것의 아주 경우에 실패 할 가능성이 dig성공합니다. getent에 대한 매뉴얼 페이지를 참조하십시오 .
스튜어트 P. 벤틀리

@Stuart가 옳습니다. 글을 쓴 이후로 많은 것을 배웠고 강력한 명령을 지나치게 단순화했습니다. getent나는 또한 좋아하지만 내 마음에 드는 남아dig +short
RubyTuesdayDONO

4
nmap -sP 192.168.178.0/24|grep YOUR_HOSTNAME|sed -n 's/.*[(]\([0-9\.]*\)[)].*/\1/p'

DNS 서버없이 찾은 솔루션이었습니다


3

아마도 가장 간결하지는 않지만 강력하고 효율적인 것 같습니다.

# $(get_host_dns_short "google.com")
#
# Outputs the IPv4 IP Address of a hostname, resolved by DNS. Returns 0 if DNS
# responded successfully; 1 otherwise. Will mask error output.
function get_host_dns_short()
{
    (
        set -o pipefail

        host -4 -W1 -t A "$1" 2>/dev/null | awk '/has address/ { print $NF; exit }'
    ) && return 0 || return 1
}

이것은 1stderr 출력을 마스킹하는 동안 단일 IPv4 IP를 출력하고 실패시 리턴 합니다.

다음과 같이 사용할 수 있습니다.

GOOGLE_IP="$(get_host_dns_short "google.com")"
if [[ $? -eq 0 ]]; then
    echo "Google's IP is ${GOOGLE_IP}."
else
    echo "Failed to resolve Google's IP."
fi

Google의 IP는 216.58.192.46입니다.

대신 IPv6 주소를 원하는 경우에, 다만 교체 -4와 함께 -6.


3

dig +noall +answer +nocomments example.com | awk '{printf "%-36s\t%s\n", $1, $5 }'


1
기존의 답변보다 어떤 방식으로 답변이 개선되는지에 대한 어떤 맥락이 좋을 것입니다. 또한 4 칸씩 명령을 들여 쓰십시오 (예 : markdown 구문).
maxschlepzig 2016 년

2

한 줄은 호스트 이름 목록을 확인합니다.

for LINE in `cat ~/Desktop/mylist`; do a=$(nslookup $LINE | awk '/^Address: / { print $1 }');  echo $a >> ~/Desktop/ip; done

2

나는 내 Mac에서 이것을 항상하고 있습니다 getent. ping해킹처럼 보입니다. 나는 /etc/hosts또한 고려하고 싶다 .

그래서 dns.lookupNode.js를 설치하여 CLI를 제공하는 사용자 를 위해 바보 래퍼를 작성했습니다 .

$ npm install -g lookup-hostname
$ lookup google.com
62.243.192.89

리졸 브 근처에 가기 전에 60 %의 파손 확률.
도트 비트

@dotbit 좀 더 자세히 설명해 주시겠습니까? 나는 '17 년 이래로 매주 사용했으며 아무런 문제가 없었습니다.
토마스 젠슨

@ Jensen 그러나 당신은 항상 그렇듯이 언제나 유일한 사람입니다. 우리 중 나머지는 대개 어떤 종류의 FAIL을 겪습니다.
dotbit

"언제나처럼" 그게 무슨 뜻입니까? "나머지 나머지 사람 "저 사람은 누구입니까? "실패" 어떤 특정 문제가 발생합니까? 궁금해.
토마스 젠슨

2

발굴이 너무 느리고 nslookup이 훨씬 빠릅니다.

nslookup google.com | grep -Po 'Address:\s*[0-9.]+' | tail -1 | sed -e 's/Address:\s*//g'

2

bash 스크립트의 가장 쉬운 방법은 모르지만 호스트 이름을 확인하고 호스트가 작동하는지 확인하려면 ping!

ping -a hostname -c 1

ping호스트 한 번 및 IP 주소로 호스트 이름을 해결.

$ ping -a www.google.com -c 1
PING www.google.com (216.58.211.132) 56(84) bytes of data.
64 bytes from arn09s10-in-f4.1e100.net (216.58.211.132): icmp_seq=1 ttl=54 time=1.51 ms

모든 사람이 가지고 있기 때문에 ping을 사용하는 것이 좋지만 스크립트에서 사용하려면 출력에서 ​​IP-Part를 필터링해야합니다.
Radon8472

1

예, 이미 많은 답변이 있지만 perl을 사용하는 솔루션이 없습니다.

perl -MSocket -MNet::hostent -E 'say inet_ntoa((gethost shift)->addr)' unix.stackexchange.com

bash 스크립트에서는 다음과 같이 사용할 수 있습니다.

#!/bin/bash
ipaddr=$(perl -MSocket -MNet::hostent -E 'say inet_ntoa((gethost shift)->addr)' unix.stackexchange.com)
echo $ipaddr

여기에 사용 된 모듈은 핵심 모듈이므로 CPAN과 함께 설치하지 않고도 어디서나 사용할 수 있습니다.


perl -MSocket -MNet::hostent -E 'say inet_ntoa((gethost shift)->addr)' unix.stackexchange.com 2>/dev/null 훨씬 더 깨끗합니다. 그러나 우리 둘 중 누구 만이 pörl을 사용하고 있지 않습니다. 다른 모든 사람들은 물론 파스칼 스크립트를 사용합니다.
dotbit

실제로 문제가 발생하면 오류 메시지를 보는 것을 선호합니다. Can't call method "addr" on an undefined value정확한 오류 메시지는 아니지만 문제에 대한 힌트를 줄 수 있습니다.
11

1
#!/bin/bash

systemd-resolve   RT.com -t A  | awk '{ print $4 ; exit }'
systemd-resolve unix.stackexchange.com -t A --legend=no | awk '{ print $4 ; exit }'

resolveip -s      RT.com
dig       +short  RT.com
host              RT.com | awk '/has address/ { print $4 }'
nslookup          RT.com | awk '/^Address: /  { print $2 }'
ping -q -c 1 -t 1 RT.com | grep PING | sed -e "s/).*//" | sed -e "s/.*(//"

ruby     -rresolv -e      ' print    Resolv.getaddress "RT.com" '
python2  -c 'import socket; print socket.gethostbyname("RT.com")'
perl     -MSocket -MNet::hostent -E 'say inet_ntoa((gethost shift)->addr)' RT.com  2>/dev/null
php      -r "echo gethostbyname( 'RT.com' );"

echo        "   all do work for me - take your pick!  "

1
루비 버전은 IP 주소 주위에 따옴표를 인쇄합니다. --- print대신에 사용해야합니다 p.
노예 Rezic

thx, @Slaven Rezic 그리고 자유롭게 공감할 수 있습니다. 다시, 여기 맨 아래에 스크립트가 실제로 더 잘 보일 수 있습니다 ... ;-)
dotbit

-1
host -t a cisco.com

이 명령은 ip 주소를 표시합니다 (도메인을 IP로 재 지정합니다)


-1

위의 솔루션 외에도 아래의 스크립트를 통해 여러 호스트 이름을 ip로 변환 할 수 있습니다. 유닉스의 핵심은 "ping"명령입니다.

getip(){ ping -c 1 -t 1 $1 | head -1 | cut -d ' ' -f 3 | tr -d '()' 2>&1 | tee >> /tmp/result.log & }

getip 'hostname.number1.net'

getip 'hostname.number2.net'

getip 'hostname.number3.net'

getip 'hostname.number4.net'

getip 'hostname.number5.net'

getip 'hostname.number6.net'

getip 'hostname.number7.net'

getip 'hostname.number8.net'
$ cat /tmp/result.log

ABC.DEF.GHI.XY1

ABC.DEF.GHI.XY2

ABC.DEF.GHI.XY3

ABC.DEF.GHI.XY4

ABC.DEF.GHI.XY5

ABC.DEF.GHI.XY6

ABC.DEF.GHI.XY7

ABC.DEF.GHI.XY8
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.