2016-06-29 3 views
-2

각 호스트 이름의 목록 인 for 루프를 통과하는 bash 스크립트를 작성한 다음 포트 22에서 응답하는 경우 각각을 테스트합니다 ssh 세션을 실행하지만 첫 번째 및 두 번째 if 문은 나머지 호스트가 아닌 목록의 첫 번째 호스트에서만 실행됩니다. 호스트가 포트 22에서 응답하지 않으면 스크립트를 다음 호스트로 계속 진행시키고 싶습니다. 스크립트가 각 호스트에 대해 ssh를 실행하도록하는 방법에 대한 아이디어가 있습니까? 이것은 루프를위한 또 다른 것이되어야 하는가?bash 스크립트의 for 루프 안에 중첩 된 if 문

#!/bin/bash 

hostlist=$(cat '/local/bin/bondcheck/hostlist_test.txt') 


for host in $hostlist; do 

test=$(nmap $host -P0 -p 22 | egrep 'open|closed|filtered' | awk '{print $2}') 

     if [[ $test = 'open' ]]; then 

         cd /local/bin/bondcheck/ 
         mv active.current active.fixed 
         ssh -n $host echo -n "$host: ; cat /proc/net/bonding/bond0 | grep Active" >> active.current 

         result=$(comm -13 active.fixed active.current) 

       if [ "$result" == "" ]; then 
           exit 0 
       else 
         echo "$result" | cat -n 
       fi 

     else 
       echo "$host is not responding" 
     fi 
done 
+0

nmap'-P0'의 최신 버전에서는'-Pn'과 같은 것을주의하십시오. – sjsam

+0

또한'test = $ (nmap $ host -P0 ...'줄은'test = $ (nmap $ host -P0 -p 22 | awk '/^22 \/tcp/{print $ 2} '' – sjsam

답변

3

exit 0 전체 스크립트를 종료합니다. 루프의 다음 반복으로 넘어 가고 싶을뿐입니다. 대신 continue을 사용하십시오.

+0

당신이 자리하고있어! 고마워. :) – user3573036

0

당신의 문제는 라인

if [ "$result" == "" ] 
then 
exit 0 
else 
echo "$result" | cat -n 
fi 

여기 exit 0$result가 비어있을 때 종료 전체 스크립트를 원인으로 가능성이 높습니다. 다음과 같은 방법으로 주위를 돌아볼 수 있습니다 :

if [ "$result" != "" ] #proceeding on non-empty 'result' 
then 
echo "$result" | cat -n 
fi