목표: 많은 호스트에서 효율적으로 병렬화할 수 있는 방법을 사용하여 호스트가 네트워크에서 실행되고 있는지 확인합니다.
빠른 수표 처리를 강조합니다.
속도를 강조하는 이유: 여러 검사(수백 번)를 빠르게 연속해서 수행하고 결과를 상당히 빠르게 반환해야 하기 때문입니다.
현재 접근 방식
현재 스크립트는 간단한 ping
명령을 사용합니다. 선택은 필수는 아니지만 반대로어느동등하거나 더 나은 신뢰성과 속도를 갖춘 적절한 도구를 대안으로 사용할 수 있습니다.
현재 스크립트
다음과 같이 :
ping -c 1 -W 100 -q "$NETWORK_HOST" &> /dev/null
이 접근 방식의 명백한 단점은 1초 미만의 응답 시간이 필요하다는 것입니다. 경험상 응답 시간은 최대 1초까지 걸릴 수 있습니다.
대안을 고려하세요
순차적 실행 속도는 잊어버리세요. ping
GNU를 사용하여 많은 명령을 병렬로 실행 parallel
하고 마지막에 결과를 대조하세요. 이것은 시도되었지만 실제로는 더 나쁜 것 같습니다.
더 나은 솔루션에 대한 직관
이 것 같다ping
가능한"폴링 상태 확인"으로 잘 작동합니다. 응답이 없을 경우를 대비해 매우 짧은 시간과 시간 초과를 기다리는 것뿐입니다.
가정: 네트워크는 안정적이고 빠른 것으로 간주되지만 호스트가 반드시 이러한 특성을 가질 필요는 없습니다.
질문
이 문제를 어떻게 해결하시겠습니까? 어떤 도구를 사용하시겠습니까? 이것이 올바른 접근 방식입니까? 코드 조각을 제공할 수 있나요?
- 환경: OS X + Ubuntu 호스트
- 스크립트 셸: Bash
- 필요한 경우 추가 소프트웨어를 설치할 수 있습니다.
- 저장소에 없는 애플리케이션에 대해 새 코드를 컴파일/설치하여 사용할 수 있습니다.
답변1
핑이 충분히 좋다면,평평한즉시 병렬로 작업할 수 있는 대안입니다.
이것은 내가 사용하는 것의 단순화된 버전입니다. 파이프로 연결된 호스트 목록(한 줄에 하나씩)과 함께 작동합니다.
probe_hosts() {
local report
fping 2>/dev/null | while read report;
do
local host=${report/ is *}
local state=${report/* is }
if [ "$state" == "alive" ];
then
echo $host
else
echo unreachable: $host >&2
fi
done
}
# this is how you use it:
cat list_of_hosts \
| probe_hosts \
| do_something_with_live_hosts
답변2
nmap
범위를 지정할 수 있습니다 .
$ nmap -sn 138.0.0.0/24
$ nmap -sn 138.0.0.0-255
이 -sn
플래그는 호스트에 대해 ping만 수행하고 반환한다는 의미입니다(즉, nmap
평소처럼 포트 스캔을 수행하지 않음).
편집하다:댓글을 읽은 후 Bahamat이 언급한 것을 보았습니다 arp
. 실제로 arp
매개변수가 없으면 내가 할 수 있는 것보다 더 빠르게 실행되며 nmap
LAN에 연결된 모든 것을 찾습니다.
$ time arp
real 0m0.411s