Bash for
루프와 ping
여러 서버를 실행할 수있는 방법을 알고 있습니다 .Linux CLI 도구를 사용 ping
하여 서버 목록에 Bash 스크립트를 작성하지 않고도이 작업을 수행 할 수 있습니까? 한번에 한?
이 같은:
$ ping host1 host2 host3
참고 : CentOS / Fedora를 특별히 찾고 있지만 다른 배포판에서 작동하면 괜찮습니다.
Bash for
루프와 ping
여러 서버를 실행할 수있는 방법을 알고 있습니다 .Linux CLI 도구를 사용 ping
하여 서버 목록에 Bash 스크립트를 작성하지 않고도이 작업을 수행 할 수 있습니까? 한번에 한?
이 같은:
$ ping host1 host2 host3
참고 : CentOS / Fedora를 특별히 찾고 있지만 다른 배포판에서 작동하면 괜찮습니다.
답변:
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와 사용하려는 프로토콜 만 알려 주면됩니다. 여기서는 기존 ping
CLI의 기능 을 모방하고자하므로 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.
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은 핑 패킷을 전송하고 라운드 로빈 방식으로 다음 대상으로 이동합니다 ... 대상이 응답하면 목록에서 기록되고 제거됩니다.
oping host1 host2 host3
oping은 ICMP 패키지 (보다 나은 "핑 패킷")를 사용하여 네트워크 호스트의 연결 가능성을 테스트합니다. IPv4 및 / 또는 IPv6을 투명 하게 사용하여 여러 호스트를 병렬로 핑 (ping) 할 수 있습니다 .
이 패키지에는 두 가지 명령 줄 응용 프로그램이 포함되어 있습니다. "oping"은 ping (1), ping6 (1) 및 fping (1)과 같은 도구를 대체합니다. "noping"은 핑을 수행하는 동안 통계를 표시하고 비정상적인 왕복 시간을 강조 표시하는 ncurses 기반 도구입니다.
나는 그것이 구체적으로 알고 있지 당신을 요구하고 있지만, bash는 스크립트가 이러한 목표를 달성하기 위해 무엇을 :
#!/bin/bash
for host; do
ping -c5 "$host" 2>&1 | tail -3 &
done
wait
엔드 포인트를 명령 행 인수로 사용하고 백그라운드 프로세스로 각각 5 카운트 핑을 보낸 후 종료하기 전에 모두 완료 될 때까지 기다립니다. 성공률 및 대기 시간에 대한 유용한 통계가 포함 된 ping 출력의 마지막 세 줄을 인쇄합니다.
wait
것은 모든 활성 자식 프로세스를 기다리므로 두 번째 루프를 피할 수 있습니다. bash 스크립트를 작성하지 않아도되는 이유 중 일부는 스크립트를 작성하거나 작성하지 않고도 모든 컴퓨터에서 작동하는 솔루션을 갖는 것입니다. 짧게 만드는 것이 더 유리한 것처럼 보이 for host; do
므로 인수 할당을 피하고 첫 번째 루프에서 수행하는 것이 좋습니다 . 이 zsh을했다 경우를 피할 수 do
및 done
그냥 interatively, 수행for host in google.com; ping -c5 "$host" |& tail -3 & wait
command &
서브 쉘에서 단순히 백그라운드 명령 (즉, )을 사용하고 (즉, 괄호로 감싸기) wait
여러 명령을 하나의 인공 명령으로 결합합니다 (예 :) (for f in google.com yahoo.com microsoft.com; do ping $f & done; wait)
. 출력은 인터리브되며이 명령 후에 Ctrl + C를 누르면 세 개의 자식 프로세스가 모두 종료됩니다. 쉘에는 많은 강력한 작업 제어 구성이 있으며이 중 하나입니다.
나는 이것이 당신을 위해 할 수 있다고 생각합니까?
eval $(printf 'ping "%s" & ' host1 host2 host3)
printf
각 인수에 대해 형식 문자열을 재사용하면서 인수를 "자동 반복"하는 기능을 활용 합니다. 따라서 위의 내용 은 인수로 제공된 각 호스트에 대해 printf
일련의 ping <hostname> &
문자열을 생성하고 명령 대체를 통해 명령에 이러한 시퀀스를 공급 eval
하여 즉시 실행되도록합니다.
printf
eval
명령은 POSIX 표준 및 명령 대체입니다.
다음과 wait
같이 and-ed를 포함하는 서브 쉘에 이러한 명령 전체를 포함합니다 .
(eval $(printf 'ping "%s" & ' host1 host2 host3) && wait)
모든 것을 마음대로 중단 할 수있는 기능을 제공합니다 Ctrl+C.
그렇지 않으면 ping
쉘의 일반적인 작업 제어를 통해 각 명령을 개별적으로 제어 할 수 있습니다 .
쉘이 프로세스 대체를 지원하는 경우 다음을 사용할 수도 있습니다.
. <(printf 'ping "%s" & ' host1 host2 host3)
입력 할 수있는 문자가 적습니다.
요점은의 경우와 동일 eval
하지만 프로세스 대체를 통해 ping
s 시퀀스를 .
(일명 source
) 명령에 공급합니다.
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'
common xargs
명령을 사용하여 여러 ping
요청 실행을 빌드 합니다.
echo host1 host2 host3 | xargs -n1 -P0 ping -c 4
여기서 host1 host2 host3
가변 수의 호스트 (IP 또는 호스트 이름의 모든 조합)가 될 수 있습니다.
이는 xargs
ping 실행 당 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 ...
--max-procs
/에 설정 한 것보다 더 많은 호스트를 핑 (ping)하는 것이 좋습니다 -P
. 그러나 호스트 수가보다 적은 경우 -P
모든 핑이 병렬로 실행됩니다. 즉, 전체 핑이 아니라 가장 긴 핑 실행만큼 오래 걸립니다.
정확히 무엇을 원하는지 모르지만 마지막 8 비트 세트를 10 진수 255로 변경할 수 있으므로 호스트는 브로드 캐스트를 받게됩니다. 실제로 네트워크에 존재하는 모든 장치에 핑 패킷을 전송합니다.
ping -c 1 xx.xx.xx.255
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
&&
첫 번째 명령이 성공적으로 완료된 경우 (즉, 종료 코드 0) 두 번째 명령 만 실행할 수 있다는 것입니다. 2) 첫 번째 핑은 ^ C없이 종료되지 않습니다. -c 및 -w 매개 변수를 추가하십시오. 사이트에 오신 것을 환영합니다!
재미와 이익을 위해서 ...
#!/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 ping 및 Linux ping에 대한 매뉴얼 페이지를 참조하십시오.
HTH
편집 : 각 핑 쿼리 @ 6 핑을 종료하고 매뉴얼 페이지 옵션을 추가하도록 약간 업데이트되었습니다.
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