/ etc / hosts를 사용하여 호스트 이름을 먼저 확인하는 Linux 명령 행 유틸리티


36

해결 호스트 이름 (몇 가지 명령 행 유틸리티가있다 host, dig, nslookup) 그러나 그들은 모두 사용하는 네임 서버는 일반 찾는 애플리케이션 동안 독점적으로, /etc/hosts첫 번째는 (gethostbyname까지도를 사용하여 나는 믿는다).

일반적인 응용 프로그램처럼 동작하는 호스트 이름을 확인하는 명령 줄 유틸리티가 /etc/hosts있습니까?

(나는 아마도 3 줄의 c와 같을 것임을 알고 있지만 다소 이식성이 좋은 쉘 스크립트 안에 필요합니다.)


상황을 좀 더 설명해 주시겠습니까? 합니까의 awk '/hostname/ { print $1 }' /etc/hosts도움?
quanta

@quanta 사실 현재 솔루션은 / etc / hosts에서 grep / sed magic입니다. 대체로 더 일반적으로 만들고 싶었습니다.
줄란

답변:


56

이것은 다음과 getent같이 쉽게 달성됩니다 .

getent hosts 127.0.0.1

getent에서 구성된 모든 유형의 데이터를 검색합니다 nsswitch.conf.


이것은 내가 좋아하는 다른 메커니즘이없는 내 알파인 고정 표시기 컨테이너에서 사용하는 도구 dignslookup.
Bruno Bronosky

26

작동하는 도구 중 하나는 getent입니다. 따라서 getent hosts www.google.com또는을 사용할 수 있습니다 getent hosts localhost. 이름 서비스 스위치 구성에 지정된대로 데이터베이스에서 항목을 검색합니다 /etc/nsswitch.conf.


1
그렇습니다. 그러나 그것은 DNS로 돌아 가지 않습니다.
slowpoison

아니요, nsswitch.conf 순서로 해결합니다.
cjc

@slowpoison, nsswitch 구성을 살펴보십시오. 내 시스템에는 files dns호스트가 있습니다. 즉, / etc / hosts를 참조한 다음 DNS 확인자를 의미합니다. 구성이 다를 수 있습니다.
Zoredache

@cjc, 그렇습니다. 나는 그것을 올바르게 시도했다고 생각하지 않습니다.
slowpoison

@ Zoredache, 나는 매우 감동합니다 getent. 이 명령을 소개해 주셔서 감사합니다.
slowpoison

8

다음과 같이 gethostbyname () (더 이상 사용되지 않음) 랩퍼를 사용할 수 있습니다.

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

또는 다음과 같은 getaddrinfo () 래퍼 :

python -c 'import socket;print socket.getaddrinfo("www.google.com","http")[0][4][0]'

getaddrinfo는 모든 인스턴스를 목록으로 반환합니다. 명령의 마지막 부분은 첫 번째 튜플 만 선택합니다. IPv6 주소도 반환 할 수 있습니다.


1
이것은 작동하지만 한동안 사용되지 않았습니다. linux.die.net/man/3/gethostbyname을 참조하십시오 .
Kyle Smith

고마워요, 몰랐어요 ;)
Mircea Vutcovici 2014 년

공감하십시오. 다른 반 휴대용 단일 라이너는 제안되지 않았습니다.
user239558

: 경우 이것은 다른 사람에게 가치가, 나는 몇 가지 명령 줄 옵션이있는 파이썬 3 버전 만든 github.com/acdha/unix_tools/blob/master/bin/getaddrinfo
크리스 아담스

6

resolveip 이것을 할 것입니다.

이상하게도 RHEL 및 Ubuntu의 mysql-server 패키지의 일부입니다.


6

[여기에서 가장 좋아하는 언어]를 사용하여 getnameinfo 를 호출하는 스크립트를 작성할 수 있습니다 . 이것이 바이너리 (예 : 핑)가 수행해야하는 방식이므로 동일한 치료를받을 수 있습니다.


6

사용 getent ahosts예를 들어, :

$ getent ahosts www.google.com | sed -n 's/ *STREAM.*//p'
216.58.210.196
2a00:1450:4006:803::2004

glibc 리졸버를 통해 모든 IPv4 및 IPv6 주소를 얻을 수 있습니다 (따라서 /etc/hosts일반적으로에서 구성한대로 먼저 사용 /etc/nsswitch.conf).

사용하지 마십시오 getent hosts당신이 중 하나의 IPv6 또는 IPv4 주소 (둘), 그리고 선택된 프로토콜이 일을하지 않는 한하지 않을 수 있습니다 줄 것 같은. 실제로, IPv6 주소가 일반적으로 선호되지만, 어떤 곳에서는 라우터에 의해 IPv6 데이터가 필터링 (지원되지 않음)됩니다.


3

"gethostbyname" 명령 행 버전 :

#!/usr/bin/perl
use Socket;

$host = shift @ARGV;
die("usage: gethostbyname hostname\n") unless(defined($host));

$packed_ip = gethostbyname($host);

if (defined $packed_ip) {
    $ip_address = inet_ntoa($packed_ip);
    print "$ip_address\n";
    exit 0
} else {
    warn "$host not found\n";
    exit 1
}

2

당신은 정말 해키와 사용할 수 있습니다 arp:

arp -n somehostname | tr -d '()' | awk '{print $2}'

그러나 그것은 정말로 추한 것이므로 그렇게해서는 안됩니다.


2

getent hosts고장났다. 그것은 IPv6 주소 gai.conf를 선호, ipv4를 선호하도록 구성해야하지만 ....

gethostbyname/etc/nsswitch.conf

hosts: files dns

그래서 이것은 getent hosts나를 위해 작동하는 것처럼 작동합니다.

또한:

perl -e 'use Socket; print inet_ntoa(inet_aton("www.google.com")) . "\n";'

작동해야합니다.


5
그것은 깨지지 않았으며 getaddrinfo (/etc/gai.conf를 읽는)를 사용하지 않습니다. getaddrinfo를 사용하려면을 실행하십시오 getent ahosts.
craig65535

1

이 시도:

if [ `grep -c "hostname" /etc/hosts` -ge 1 ]; then
    ip=`awk '/hostname/ { print $1 }' /etc/hosts`
else
    ip=`host hostname | awk '/hostname has address/ { print $4 }'`
fi

-1

다음 명령은 직접 DNS 서버 조회를 통해 DNS / etc / hosts를 통해 조회를 수행합니다.

ping -W2 -c1 google.com | grep PING | sed -r "s/^[^\(]*\(([\.0-9]*)\).*/\1/"

이 명령은 대기 시간이 2 초인 도메인 (이 경우 google.com)에 한 번 핑을 시도하고 PING google.com (216.58.199.36) 56 (84)이라는 PING 명령의 첫 번째 줄을 가져옵니다. ) 바이트의 데이터 '로 이동 한 다음 스트림 편집기 (sed)를 사용하여 첫 번째 대괄호 세트를 감지하고 찾고있는 IP 주소 인 데이터를 추출하십시오.

참고 : URL에 괄호 (일명 괄호)가 있으면 정규 표현식이 작동하지 않지만 드문 경우입니다.

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