(면책 조항 - bash 쉘 스크립팅을 사용하면 이 작업을 더 쉽게 수행할 수 있다는 것을 알고 있지만 nmap
연습해야 합니다.)
$ scriptname 192.168.42 18 23
Checking: 192.168.42.18 19 20 21 22 23
Live hosts:
192.168.42.21
192.168.42.22
There were:
5 alive hosts
1 not alive hosts
found through the use of 'ping'.
위의 출력은 다음과 같습니다. "확인 중: ..."은 확인 중인 모든 IP를 나열합니다. 모든 활성 호스트가 "활성 호스트" 아래에 나열되고 전체 활성 및 비활성 호스트가 실행됩니다.
이것이 내가 지금까지 가지고 있는 것입니다
for i in `seq ${2} ${3}`
do
ping -c 1 -t 1 ${1}.${i} > /dev/null 2>&1;
if [ $? -eq 0 ]; then
echo "Live hosts: \n ${1}.${i}"; LIVECOUNT=$( ???? )
fi
done
왜냐하면 LIVECOUNT=$( ???? )
무엇을 넣어야 할지 모르기 때문이죠. 살아있는/무생물의 누계를 어떻게 유지하는지 모르겠습니다. 확인이 완료될 때까지 "Live Host" 및 "Has" 섹션이 나타날 필요가 없습니다.
답변1
첫 번째 질문에 대한 짧은 대답은 입니다 LIVECOUNT=$((LIVECOUNT+1))
. 이 산술 확장은 이중 괄호 $(())로 표시되며 변수 LIVECOUNT는 ping 명령이 0을 성공적으로 반환할 때마다 증가됩니다.
총 호스트 수를 계산하는 간단한 방법은 상위 주소(${3})에서 하위 주소(${2})를 뺀 다음 1을 더하여 총 호스트 수를 구하는 것입니다.
그래서:
#!/bin/bash
CHECKING=${1}.
LIVEHOSTS=""
LIVECOUNT=0
TOTALHOSTS=$(($3 - $2 + 1))
for i in `seq ${2} ${3}`
do
CHECKING="$CHECKING${i} "
ping -c 1 -t 1 ${1}.${i} > /dev/null 2>&1;
if [ $? -eq 0 ]; then
LIVEHOSTS="$LIVEHOSTS \n ${1}.${i}"
LIVECOUNT=$((LIVECOUNT+1))
fi
done
echo ""
echo "Checking: $CHECKING"
echo ""
echo "Live hosts:"
echo -e "$LIVEHOSTS"
echo ""
echo "There were:"
echo "$LIVECOUNT alive hosts"
echo "$((TOTALHOSTS - $LIVECOUNT)) not alive hosts"
echo "found through the use of ping"
다음 사항에 유의하십시오. $CHECKING은 매개변수 1 ${1}에 의해 제공된 서브넷으로 시작하고 do 루프가 반복될 때마다 현재 호스트 번호 ${i}를 추가하는 문자열입니다.
형식이 지정된 방식("라이브 호스트:" 줄 앞에 "체크:" 줄 추가)으로 인해 라이브 호스트를 문자열($CHECKING과 유사)로 유지하는 것이 더 쉬워 보이며 이것이 $LIVEHOSTS의 의미입니다.
$LIVEHOSTS 및 $LIVECOUNT는 무슨 일이 일어나고 있는지 명확히 하기 위해 공백과 0으로 초기화됩니다. 이는 필수 사항이 아닙니다.
$LIVEHOSTS를 출력할 때 echo -e 사용에 유의하세요. 이는 \n이 개행 문자로 작동할 수 있도록 하기 위한 것입니다.
편집: 끝에 있는 목록 대신 현재 확인 중인 IP를 표시하려면 해당 행을 교체 CHECKING="$CHECKING${i} "
하고 echo "Checking $CHECKING${i}"
제거하거나 주석 처리하세요 echo "Checking: $CHECKING"
. echo
그랬기 때문에~에루프 내부에서는 do
$i의 현재 값을 사용하여 각 패스마다 인쇄합니다. (이것은 echo "Live hosts"
원본 스크립트에서 사용한 것에 대해 @slm이 지적한 것과 동일합니다 .)