여러 IP 주소를 동시에 ping하는 방법은 무엇입니까?


22

Bash for루프와 ping여러 서버를 실행할 수있는 방법을 알고 있습니다 .Linux CLI 도구를 사용 ping하여 서버 목록에 Bash 스크립트를 작성하지 않고도이 작업을 수행 할 수 있습니까? 한번에 한?

이 같은:

$ ping host1 host2 host3

참고 : CentOS / Fedora를 특별히 찾고 있지만 다른 배포판에서 작동하면 괜찮습니다.


8
왜 당신이 작은 일-라이너 스크립트-리눅스의 아름다움과 철학 ;-)에 반대합니까? (작고 간단한 프로그램을 작성하고 특별한 요구 사항에 맞는 접착제를 작성하십시오.)
Peter-Reinstate Monica

1
리포지토리에서 패키지를 설치하는 것보다 스크립트를 2000+ VM으로 복사하는 것이 훨씬 쉽습니다. 8-). 스스로 스크립트 솔루션을 쉽게 작성할 수 있습니다. 또한 자체 답변을 보았으므로 인터넷에서 콘텐츠를 만들고 있습니다. 사용자는 단일 cmd 대 셸 스크립트를 요구하고 기본 Q로 인식하는 것에 대한 간단한 A'er를 찾지 못했습니다.
slm

3
당신의 의도는 2000 + 가상 머신에서 다중 핑을 할 경우 ... 나는 여전히 내 머리에 상처 수
하겐 폰 Eitzen

@HagenvonEitzen-아니요, 2000+ VM에 툴링을 설치하여 사용자가 툴을 사용할 수 있도록합니다.
slm

1
왜 이것이 필요할까요?
Tvde1

답변:


32

NMAP 프로젝트 를 살펴보면 그 위에 추가 도구가 포함되어 있음을 알 수 있습니다 nmap. 이러한 도구 중 하나는 nping다음과 같은 기능을 포함합니다.

Nping에는 매우 유연하고 강력한 명령 줄 인터페이스가있어 생성 된 패킷을 완전히 제어 할 수 있습니다. Nping의 기능은 다음과 같습니다.

  • 맞춤형 TCP, UDP, ICMP 및 ARP 패킷 생성
  • 다중 대상 호스트 사양을 지원합니다.
  • 다중 대상 포트 사양을 지원합니다.
  • ...

nping 부팅 할 표준 EPEL 저장소에 있습니다.

$ repoquery -qlf nmap.x86_64 | grep nping
/usr/bin/nping
/usr/share/man/man1/nping.1.gz

용법

여러 서버를 핑하려면 nping이름 / IP와 사용하려는 프로토콜 만 알려 주면됩니다. 여기서는 기존 pingCLI의 기능 을 모방하고자하므로 ICMP를 사용합니다.

$ sudo nping -c 2 --icmp scanme.nmap.org google.com

Starting Nping 0.7.70 ( https://nmap.org/nping ) at 2019-06-14 13:43 EDT
SENT (0.0088s) ICMP [10.3.144.95 > 45.33.32.156 Echo request (type=8/code=0) id=42074 seq=1] IP [ttl=64 id=57921 iplen=28 ]
RCVD (0.0950s) ICMP [45.33.32.156 > 10.3.144.95 Echo reply (type=0/code=0) id=42074 seq=1] IP [ttl=46 id=24195 iplen=28 ]
SENT (1.0091s) ICMP [10.3.144.95 > 45.33.32.156 Echo request (type=8/code=0) id=42074 seq=2] IP [ttl=64 id=57921 iplen=28 ]
SENT (2.0105s) ICMP [10.3.144.95 > 45.33.32.156 Echo request (type=8/code=0) id=42074 seq=2] IP [ttl=64 id=57921 iplen=28 ]
RCVD (2.0107s) ICMP [45.33.32.156 > 10.3.144.95 Echo reply (type=0/code=0) id=42074 seq=2] IP [ttl=46 id=24465 iplen=28 ]
SENT (3.0138s) ICMP [10.3.144.95 > 64.233.177.100 Echo request (type=8/code=0) id=49169 seq=2] IP [ttl=64 id=57921 iplen=28 ]

Statistics for host scanme.nmap.org (45.33.32.156):
 |  Probes Sent: 2 | Rcvd: 2 | Lost: 0  (0.00%)
 |_ Max rtt: 86.053ms | Min rtt: 0.188ms | Avg rtt: 43.120ms
Statistics for host google.com (64.233.177.100):
 |  Probes Sent: 2 | Rcvd: 0 | Lost: 2  (100.00%)
 |_ Max rtt: N/A | Min rtt: N/A | Avg rtt: N/A
Raw packets sent: 4 (112B) | Rcvd: 2 (108B) | Lost: 2 (50.00%)
Nping done: 2 IP addresses pinged in 3.01 seconds

이 도구에서 찾은 유일한 단점은 루트 권한이 필요한 ICMP 모드를 사용하는 것입니다.

$ nping -c 2 --icmp scanme.nmap.org google.com
Mode ICMP requires root privileges.

3
그 결과는 어떻습니까? 통계에 따르면 각 호스트에 2를 보냈지 만 이전 출력에서는 3을 scanme.nmap.org (45.33.32.156)로, 1을 google.com (64.233.177.100)으로 보냈습니다. 내가 그것을 실행할 때 나에게도 일어난다.
JoL

4
그것은 거짓말입니다 ... (물론 자체와 일치하지 않기 때문에). strace로 실행하면 google.com에 핑을 보내지 만 scanme.nmap.org로 보낸 줄을 출력하는 것을 볼 수 있습니다. 재미있는 버그. 그러나 항상 그런 것은 아닙니다.
JoL

nmap또한 option을 지정하여 ICMP를 직접 지원합니다 -sn. 자세한 내용은 내 답변 을 참조하십시오.
scai

@scai-A'er에게 감사합니다. 나는 이것을 연구하는 동안 그 것을 발견했습니다. 내 접근 방식이 가장 깨끗하다는 것을 알았습니다.
slm

1
'이 도구로 찾은 유일한 단점은 루트 권한이 필요한 ICMP 모드를 사용하는 것입니다.' 그렇습니다. 흥미로운 일이지만 기능과 관련이 있습니다 (적어도 Linux에서는 루트에 대해 setuid exec를 수행 할 수도 있음). setcap을 사용하거나 setuid를 제공하는 것이 좋습니다 ....
Pryftan

18

fping 은 같은 이름의 Fedora 패키지에 있으며 많은 호스트 또는 일련의 IP 주소를 허용합니다.

$ fping -a -A -c 1 hosta hostb
192.168.0.20 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 0.64/0.64/0.64
192.168.1.3  : xmt/rcv/%loss = 1/1/0%, min/avg/max = 0.50/0.50/0.50

fping은 핑 패킷을 전송하고 라운드 로빈 방식으로 다음 대상으로 이동합니다 ... 대상이 응답하면 목록에서 기록되고 제거됩니다.


9
oping host1 host2 host3

기술:

oping은 ICMP 패키지 (보다 나은 "핑 패킷")를 사용하여 네트워크 호스트의 연결 가능성을 테스트합니다. IPv4 및 / 또는 IPv6을 투명 하게 사용하여 여러 호스트를 병렬로 핑 (ping) 할 수 있습니다 .

이 패키지에는 두 가지 명령 줄 응용 프로그램이 포함되어 있습니다. "oping"은 ping (1), ping6 (1) 및 fping (1)과 같은 도구를 대체합니다. "noping"은 핑을 수행하는 동안 통계를 표시하고 비정상적인 왕복 시간을 강조 표시하는 ncurses 기반 도구입니다.


기술적으로 ICMP는 일반적으로 오류보고를위한 것이며 다양한 기능이 있습니다. 실제로 ping은 ECHO_REQUEST / ECHO_REPLY 유형의 ICMP를 사용합니다 (이전 iirc의 경우 8이지만 오랜 시간이 지났으며 확인하기에는 너무 게으 릅니다). 어쩌면 당신이 인용 한 설명은 실제로 oping 자체에 대한 것이지만 엄격하게 정확하지는 않습니다 (또는 설명보다 훨씬 단순화되어 있습니다 ... 또는 어쩌면 그렇지 않을 수도 있습니다). ).
Pryftan


6

나는 그것이 구체적으로 알고 있지 당신을 요구하고 있지만, bash는 스크립트가 이러한 목표를 달성하기 위해 무엇을 :

#!/bin/bash

for host; do
    ping -c5 "$host" 2>&1 | tail -3 &
done

wait

엔드 포인트를 명령 행 인수로 사용하고 백그라운드 프로세스로 각각 5 카운트 핑을 보낸 후 종료하기 전에 모두 완료 될 때까지 기다립니다. 성공률 및 대기 시간에 대한 유용한 통계가 포함 된 ping 출력의 마지막 세 줄을 인쇄합니다.


3
pid를 기억할 필요는 없습니다. 간단한 wait것은 모든 활성 자식 프로세스를 기다리므로 두 번째 루프를 피할 수 있습니다. bash 스크립트를 작성하지 않아도되는 이유 중 일부는 스크립트를 작성하거나 작성하지 않고도 모든 컴퓨터에서 작동하는 솔루션을 갖는 것입니다. 짧게 만드는 것이 더 유리한 것처럼 보이 for host; do므로 인수 할당을 피하고 첫 번째 루프에서 수행하는 것이 좋습니다 . 이 zsh을했다 경우를 피할 수 dodone그냥 interatively, 수행for host in google.com; ping -c5 "$host" |& tail -3 & wait

4
SIGINT 트랩은이 스크립트를 훨씬 실용적으로 만듭니다.
Gilles 'SO- 악마 그만해'

2
대화식으로 사용하려면 command &서브 쉘에서 단순히 백그라운드 명령 (즉, )을 사용하고 (즉, 괄호로 감싸기) wait여러 명령을 하나의 인공 명령으로 결합합니다 (예 :) (for f in google.com yahoo.com microsoft.com; do ping $f & done; wait). 출력은 인터리브되며이 명령 후에 Ctrl + C를 누르면 세 개의 자식 프로세스가 모두 종료됩니다. 쉘에는 많은 강력한 작업 제어 구성이 있으며이 중 하나입니다.
거짓말 라이언

2
모두 감사합니다. 예, 게시하는 것을 주저했지만 여기 Q / A는 OP뿐 아니라 비슷한 문제가있는 모든 사람을위한 것이며이 질문을 우연히 발견하고 추가 소프트웨어를 설치하고 싶지 않은 사람들이있을 것입니다. 작업을 수행합니다.
Jesse_b

@JoL 그러나 확실히 이러한 도구는 기본적으로 모든 호스트에 설치되지는 않습니다. 물론 당신이 말하는 것은 사실이 아니지만…
Pryftan

2

나는 이것이 당신을 위해 할 수 있다고 생각합니까?

eval $(printf 'ping "%s" & ' host1 host2 host3)

printf각 인수에 대해 형식 문자열을 재사용하면서 인수를 "자동 반복"하는 기능을 활용 합니다. 따라서 위의 내용 은 인수로 제공된 각 호스트에 대해 printf일련의 ping <hostname> &문자열을 생성하고 명령 대체를 통해 명령에 이러한 시퀀스를 공급 eval하여 즉시 실행되도록합니다.

printfeval명령은 POSIX 표준 및 명령 대체입니다.

다음과 wait같이 and-ed를 포함하는 서브 쉘에 이러한 명령 전체를 포함합니다 .

(eval $(printf 'ping "%s" & ' host1 host2 host3) && wait)

모든 것을 마음대로 중단 할 수있는 기능을 제공합니다 Ctrl+C.

그렇지 않으면 ping쉘의 일반적인 작업 제어를 통해 각 명령을 개별적으로 제어 할 수 있습니다 .

쉘이 프로세스 대체를 지원하는 경우 다음을 사용할 수도 있습니다.

. <(printf 'ping "%s" & ' host1 host2 host3)

입력 할 수있는 문자가 적습니다.

요점은의 경우와 동일 eval하지만 프로세스 대체를 통해 pings 시퀀스를 .(일명 source) 명령에 공급합니다.


2

Nmap 은 ICMP (ping scan) 및 여러 호스트를 지원합니다.

nmap -sn -n 127.0.0.1 8.8.8.8

이라고하는 모든 대상 IP (공백 또는 줄 바꿈으로 구분)가 포함 된 파일을 만들 수도 있습니다 targets.txt. 그런 다음 다음을 실행하십시오.

nmap -sn -n -iL targets.txt

옵션 설명 :

  • -sn 핑 스캔.
  • -n DNS 확인을 비활성화하십시오.
  • -iL 파일 이름을 입력하십시오.

정말 많은 수의 대상을 핑하려는 경우 다른 흥미로운 옵션 :

  • -T4 스캔 지속 시간을 줄이려면 타이밍을 늘리십시오.
  • --min-parallelism 100 병렬 프로브 수를 늘리십시오.
  • -oG <file> 스캔 결과를 Grepable 형식으로 파일에 씁니다.

파일을 만들지 않고

파일 작성을 잊고 a -를 사용 하여 파이프에서 입력을 받거나 |STDIN을 통해 출력을 재지 정하는 기존의 방법을 통해 입력 할 수도 있습니다 .

예 :

$ ( echo www.google.com; echo www.yahoo.com ) | sudo nmap -sn -n -iL -

-또는-

$ sudo nmap -sn -n -iL - < <(echo www.google.com; echo www.yahoo.com)

-또는-

$ sudo nmap -sn -n -iL - <<< $'www.google.com\nwww.yahoo.com'

참고 문헌


2

common xargs명령을 사용하여 여러 ping요청 실행을 빌드 합니다.

echo host1 host2 host3 | xargs -n1 -P0 ping -c 4

여기서 host1 host2 host3가변 수의 호스트 (IP 또는 호스트 이름의 모든 조합)가 될 수 있습니다.

이는 xargsping 실행 당 1 개의 입력 인수를 강제 실행하도록 기본값을 변경하고 무제한의 병렬 하위 프로세스 (ping 된 호스트 당 1 개)를 허용합니다. 많은 수의 호스트를 핑하려는 경우 -P(일명 처리 --max-procs) (일명 적은 수로) 현명한 값으로 설정하는 것이 좋습니다 .

직접 사용할 수있을만큼 짧거나 쉘 프로파일 또는 rc 파일에 함수로 추가되거나에서 작은 스크립트로 바뀔 수 있습니다 $PATH. 아래 예에서는 -P과도한 자원 소비를 피하기 위해 10으로 설정되었습니다.

스크립트 예 : /usr/bin/mping

#!/bin/sh

echo $@ | xargs -n1 -P10 ping -c4

내 함수 예 ~/.bashrc

function mping() {
    echo $@ | xargs -n1 -P10 ping -c4
} 

그리고 다음과 같이 사용하십시오 :

mping host1 host2 host3 ...

1
-w 2를 사용하여 ping을 2 초 이상 기다리지 않도록 고려할 수 있습니다. 기본값은 10 초이며 ping 호출 당이므로 완료하는 데 30 초 이상 걸릴 수 있습니다.
Criggie

1
예, --max-procs/에 설정 한 것보다 더 많은 호스트를 핑 (ping)하는 것이 좋습니다 -P. 그러나 호스트 수가보다 적은 경우 -P모든 핑이 병렬로 실행됩니다. 즉, 전체 핑이 아니라 가장 긴 핑 실행만큼 오래 걸립니다.
Jason Musgrove

1

정확히 무엇을 원하는지 모르지만 마지막 8 비트 세트를 10 진수 255로 변경할 수 있으므로 호스트는 브로드 캐스트를 받게됩니다. 실제로 네트워크에 존재하는 모든 장치에 핑 패킷을 전송합니다.

ping -c 1 xx.xx.xx.255

1
그것은 내가 찾고있는 것이 아닙니다.
slm

8
사이트에 오신 것을 환영합니다-이것은 좋은 생각이며 IP 네트워크에서의 브로드 캐스트 IP와 그 목적에 대한 이해를 보여 주며 완전히 정확합니다. 그러나이 좁은 정의 된 경우 OP의 특정 요구 사항과 일치하지 않습니다. 계속해서 다른 질문에 답하십시오.
Criggie

0
ping google.com && ping localhost

산출

Pinging google.com [xxxxxxx] with 32 bytes of data:
Reply from xxxxxxx: bytes=32 time=210ms TTL=49
Reply from ::1: time<1ms
Reply from xxxxxxx: bytes=32 time=212ms TTL=49
Reply from ::1: time<1ms
Reply from xxxxxxx: bytes=32 time=211ms TTL=49
Reply from ::1: time<1ms

이것의 단점은 1) &&첫 번째 명령이 성공적으로 완료된 경우 (즉, 종료 코드 0) 두 번째 명령 만 실행할 수 있다는 것입니다. 2) 첫 번째 핑은 ^ C없이 종료되지 않습니다. -c 및 -w 매개 변수를 추가하십시오. 사이트에 오신 것을 환영합니다!
Criggie

-1

재미와 이익을 위해서 ...

#!/bin/sh -

# sends six "pings" to a list of hosts defined in "hosts" below

hosts="
host.a
host.b
host.c
host.d
host.e
"

for p in $hosts
do
# ONLY CHOOSE ONE OF THE FOLLOWING, NOT BOTH
# dump results to file
    ping -c 6 $p >>./PINGED
# dump output to console
    ping -c 6 $p
done

exit

이것은 쉽게 향상 될 수 있습니다 . 꽤 유용합니다. :)

추가 옵션은 bsd pingLinux ping에 대한 매뉴얼 페이지를 참조하십시오.

HTH

편집 : 각 핑 쿼리 @ 6 핑을 종료하고 매뉴얼 페이지 옵션을 추가하도록 약간 업데이트되었습니다.


첫 번째 ping호출은 치명적인 오류가 발생하지 않으면 반환되지 않습니다.
Gilles 'SO- 악마 그만해'

정말? 여기에 게시하기 전에 테스트했으며 설명대로 작동했습니다. 모든 호스트가 핑에 응답하는 것은 아닙니다. 쿼리 한 호스트가 응답하지 않았을 수 있습니다. 어쨌든. 빠른 피드백을 제공하기 위해 쿼리를 호스트 당 6 개의 요청으로 제한했습니다.
누군가

2
이제 적어도 스크립트는 실제로 종료 될 수 있습니다. 그러나 병렬 처리가 없으면 여전히 쓸모가 없습니다. 첫 번째 호스트가 응답하면 사용자는 처음 5 초 동안 다른 호스트에 대한 정보를 얻지 못합니다.
Gilles 'SO- 악마 그만해'

글쎄요, 이것은 필요에 따라 구축하기위한 더 많은 예가되도록 의도되었습니다. 파이프를 완전히 포화시키는 다른 것을 쉽게 만들 수 있습니다. 하지만 그게 당신이 진짜로 추구하는 것입니까? :)
누군가

1
내가 해야 할 일은 ping 맨 페이지에 대한 링크를 만드는 것입니다. 솔직히 나는 그것을 자신의 수단으로 쉽게 수정할 수있는 쉬운 템플릿으로 만 만들었습니다. ping은 OS마다 다르고 각 개인이 작업 할 수있는 다양한 네트워크 조건에서 크게 다릅니다. 따라서 모든 사람에게 "완벽한"기본값은 없습니다. 각각은 "스윗 스팟"이 있습니다. :) 내가 완벽하게 작동한다고 언급 했습니까? ;)
누군가

-2

아래 간단한 명령을 사용하십시오.

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