2017-10-04 11 views
0

차단 된 이벤트에서 포트/프로토콜을 확인/열어 볼 스크립트를 작성하고 있습니다. 내가 지금까지 가지고있는 것은 아래에있다. 포트/프로토콜 이름이 이상하게 보입니다. 나는 IP 주소를 예상 했었지만 이전에는 해본 적이 없다. 호스트가 DSLAM의 IP 주소가됩니까? 또한, 현재 머신이라면 호스트를 지정하지 않고 nc를 실행할 수 있습니까? 그렇지 않으면이 스크립트가 필요한 것을 수행합니까?차단 된 이벤트에서 포트/프로토콜을 여는 쉘 스크립트가 맞는지 확실하지 않습니다.

#!/bin/bash 

PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin 

echo -e "############################nnnPresent ports opened on this machine are 

$(iptables -nL INPUT | grep ACCEPT | grep dpt) 

nCompleted listing...nnn#########################" 

#these look funny to me 
PORTS=(123 161 69 "UDP" 80 443 22 8443 8080 23 25 3307 "TCP" "HTTPS" "SNMP" "SFTP" "TFTP") 
#modified ip's for public sharing 
HOSTS=("10.x.x.x" "10.x.x.x" "10.x.x.x" "10.x.x.x" "10.x.x.x") 

for HOST in "${HOSTS[@]}" 
    do 
    for PORT in "${PORTS[@]}" 
     do 
     #see which ones need opening...0 is pass (open), 1 fail, 5 timeout; need host still 
     #alternatively try nmap 
     nc -z -v -w5 ${HOST} ${PORT} 
     #if it's not open, then open it 
     if [ "$?" ne 0 ]; then #shellcheck err this line: Couldn't parse this test expression. 
      iptables -A INPUT -m tcp -p tcp --dport "$PORT" -j ACCEPT && 
      { service iptables save; 
      service iptables restart; 
      echo -e "Ports opened through iptables are n$(iptables -nL INPUT | grep ACCEPT | grep dpt)"; } 
     else 
      echo "Port $PORT already open" 
     fi 
    done 
done 

나는 test if port is open를 참조하고, 또한 open port했습니다. 그리고, 필요하지 을

HOSTS=("10.x.x.x" "10.x.x.x" "10.x.x.x" "10.x.x.x" "10.x.x.x") 

for HOST in "${HOSTS[@]}" 
do 
    < stuff ... > 
done 

< stuff ... > 네 번 실행 가정하면

+1

나는 몇 가지 구문 오류를보고 확신합니다. http://shellcheck.net에 코드를 잘라내거나 붙여 넣기하여 오류를 수정 한 다음 Q를 업데이트하십시오. – shellter

+0

감사! 그 사이트가 존재한다는 것을 몰랐습니다. if 행을 구문 분석하는 것에 대해 여전히 불평하고 있지만, 이유는 확실하지 않습니다. if 라인을 필요한 공백으로 업데이트했습니다. – Michele

+1

'[...]'안에'-ne'을 넣고 싶다고 생각합니다. 그리고 나는 그 shellcheck이 그것을 놓쳤다는 것에 놀랐다. 커맨드 라인에서 그 라인의 코드 만 실행하면,'-ksh : [: ne : unknown operator',하지만 그것은'ksh'입니다. 테스트 할 현재'bash '가 없습니다. 행운을 빕니다. – shellter

답변

2
  1. 이 라인은 홀수 보인다는 OP edit #6 각 목마에 $HOST 동일한 값을 할당하는 외부 for 루프를 추가 위의 7 행은 다음과 같습니다.

    HOST="10.x.x.x" 
    < stuff ... > 
    
  2. 이 라인에서 쉼표를 제거합니다 (. 고정) :

    PORTS=(123, 161, 69, UDP, 80, 443, 22, 8443, 8080, 23, 25, 
         3307, TCP, HTTPS, SNMP, SFTP, TFTP) 
    

    bash

    가 배열을 정의하는 쉼표를 사용하지 않으며, 쉼표가 를 사용하는 경우 그들은 배열 데이터의 문자가된다. 그 위에 그대로 예, 배열 정확히을 제공 :

    echo ${PORTS[0]} 
    

    출력을 :

    123, 
    
+0

정말 고마워요! 나는 그것을 깨닫지 못했다. 그에 따라 코드를 업데이트했습니다. 나는 또한 호스트 배열을 추가했다. 다행히도 for 루프를 그렇게 중첩시킬 수 있기를 바랍니다. 내가 shellcheck을 사용하여 검사 할 때 if 행에서 "이 테스트 표현식을 구문 분석 할 수 없습니다"라는 불평을합니다. – Michele

+1

@Michele :'iptables' 결과를'echo' 문에서 사용하는 var로 변환합니다. 즉'count = $ (iptables -nL INPUT | grep ACCEPT | grep dpt); echo -e "stuff $ count"'. 현재 코드로 Q를 갱신하고 쉘 체크 오류를 생성하는 행을 강조 표시하십시오. 행운을 빕니다. – shellter

+0

@shellter - 지금 질문에 줄에 오류 메시지를 추가했습니다. – Michele