sed를 사용하여 ping 명령에서 IP 주소를 추출하시겠습니까? [반복하다]

sed를 사용하여 ping 명령에서 IP 주소를 추출하시겠습니까? [반복하다]

서버에서 실행되는 Bash 도구를 만들었습니다. 이 도구는 특정 시간 범위(오전 5시부터 오후 3시 30분까지) 내에서 특정 IP 주소를 차단합니다.

현재로서는 이 도구가 제대로 작동하지만 특정 웹사이트의 IP 주소를 텍스트 파일에 수동으로 입력하고 도구가 "head" 및 "tail" 명령을 사용하여 n번째 줄을 기반으로 IP 주소를 추출하도록 해야 합니다. 저는 단일 핑이 더 가볍고 휴대성이 좋다고 믿기 때문에 이렇게 하고 싶지 않습니다. 따라서 Google에 ping을 실행하면 다음과 같습니다.

ping google.com -c 1 -s 16

출력은 다음과 같습니다:

Ubuntu@yokai:~# ping google.com -c 1 -s 16
PING google.com (173.194.66.138) 16(44) bytes of data.
24 bytes from qo-in-f138.1e100.net (173.194.66.138): icmp_seq=1 ttl=37 time=46.7 ms

--- google.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 46.748/46.748/46.748/0.000 ms

출력 범위를 좁히는 명령은 다음과 같습니다.

ping google.com -c 1 -s 16 | grep -o '([^ ]*' | tr -d '(44):\n'

이것은 나에게 출력을 제공합니다 :

173.19.66.113173.19.66.113ubuntu@yokai

보시다시피, 동일한 IP 주소가 중복되어 있습니다. 단일 IP 주소를 변수에 저장하고 스크립트를 cronjob으로 실행할 수 있도록 sed를 사용하여 중복을 제거하려면 어떻게 해야 합니까? 아니면 더 나은 추적을 위해 tr을 사용할 수 있습니까?

(편집하다)

호스트 이름이나 도메인에서 IP 주소를 확인하는 방법을 이미 알고 있습니다. 내가 여기서 묻는 것은 그게 아니다. 이 질문은 특히 제가 만든 도구의 이식성을 높이기 위해 sed를 사용하여 ping 출력을 관리하는 것에 관한 것입니다. ping은 거의 모든 Linux 배포판의 기본값이기 때문입니다.

(업데이트) 어떤 사람들은 이 질문을 그것과 아무 관련이 없는 다른 헛소리 질문의 중복으로 표시했기 때문에 영어를 이해하는 데 어려움을 겪는 정신지체자들이 이해할 수 있도록 충분히 명확하게 설명하겠습니다.

어떻게분석하다이것"유일한" IP 주소~에서ping 산출ping도메인 이름에 사용되는 경우.

도메인 이름을 확인하기 위한 요청이 아니므로 중복이 아닙니다!

sed(최신 업데이트) 이 질문을 통해 필요한 것을 달성하기 위한 올바른 POSIX 정규식을 배웠으므로 원래는 ping 출력에서 ​​단일 IP 인스턴스를 인쇄하기 위한 정규식에 대해 질문했다는 점을 분명히 해야 합니다 . 그 이후로 나는 접근 방식을 개선했으며 더 이상 여기에 있는 답변을 사용하지 않지만 여기에서 도움을 주려는 모든 사람의 노력에 감사드립니다. 이제 특정 도메인 이름 확인을 차단하기 위해 특정 시간에 iptables를 구성하기 위해 만든 타이머 스크립트를 사용하고 있습니다. 도움을 주신 모든 분들께 다시 한번 감사드립니다.

답변1

pingICMP 응답을 기반으로 호스트가 작동 중인지 작동 중지되었는지 확인하는 데 사용되며 IP 주소를 확인하는 데 적합한 도구는 아니며 이 목적을 위한 특수 도구가 있습니다.

당신은 그것을 살펴보아야 합니다 dig. host- nslookup당신에게 가장 적합한 것이 무엇이든 좋습니다.

이것은 dig출력입니다:

% dig +short google.com
123.108.243.57
123.108.243.51
123.108.243.54
123.108.243.48
123.108.243.60
123.108.243.52
123.108.243.56
123.108.243.55
123.108.243.61
123.108.243.58
123.108.243.49
123.108.243.50
123.108.243.59
123.108.243.47
123.108.243.53

참고로, Linux에서 NSSwitch(네임 서비스 스위치)를 통해 쿼리하려면 데이터베이스 와 함께 (또는 ) 명령을 /etc/nsswitch사용하세요 . 예:getenthostsahosts

getent hosts google.com

내 컴퓨터에는 다음이 있습니다.

hosts: files mdns4 dns

이므로 순차적으로 조회하여 사용하거나 /etc/nsswitch.conf이름 을 기준으로 사용 합니다 .getent hostsgethostbyaddr(3)gethostbyname(3)ahostsgetaddrinfo(3)

기본적으로 내 구성에 따라 먼저 확인하고 /etc/hostsmDNS를 확인한 다음 마지막으로 DNS를 확인합니다.


pingand 사용을 고집한다면 sed다음과 같이 할 수 있습니다.

% ping -c1 google.com | sed -nE 's/^PING[^(]+\(([^)]+)\).*/\1/p'
123.108.243.56

답변2

Google에서 검색하다가 다른 링크를 찾았습니다.unix.SE 게시물언급 getent- 이런 프로그램이 있는지도 몰랐습니다.

getentlike를 사용하여 IP를 호스트 이름으로 확인할 수 있습니다 dig. 내 시스템에는 getent기본적으로 설치되어 있지만 그렇지 않습니다 dig. ipv6 호스팅이 필요한 ahostsv4경우 ahostsv6.

getent ahostsv4 google.com | awk '{print $1}' | head -1

정규식/sed가 좋지 않고 @heemayl의 답변을 알아낼 수 없기 때문에 이 답변을 추가하고 있습니다.

답변3

한 가지 주의할 점은 dig@heemayl의 출력에서 ​​볼 수 있듯이 일부 사이트에는 여러 IP 주소가 있을 수 있다는 것입니다. ping첫 번째 주소만 사용되므로 이러한 주소를 모두 얻으려면 DNS 조회를 수행해야 할 수도 있습니다 . 주소를 구체적으로 나열하는 대신 주로 연결하려는 다른 항목에도 마찬가지입니다.

(또한 Google과 같은 경우 현재 위치에 따라 다른 IP 주소를 얻게 됩니다. 여기서는 문제가 아닐 수 있지만 주목할 가치가 있습니다.)

또 다른 것은 당신이 사용한 명령에 관한 것입니다. 이 작업은 다음 과 같습니다. 입력에서 , , 및 tr -d '(44):\n'문자의 모든 복사본을 제거합니다 . 항상 문자열이 아닌 단일 문자를 살펴보십시오. 얻은 출력을 보면 IP 주소 중간에 이 누락된 것을 알 수 있습니다. 문자열 작업과 같은 다른 도구를 사용하십시오.(4):\ntr4sed

다양한 색상을 보여드리기 위해자전거 창고, GNU grep을 사용하는 또 다른 간단한 방법이 있습니다.

$ ping google.com -c1 | head -1 | grep -Eo '[0-9.]{4,}'
172.217.22.174

관련 정보