2017-10-04 10 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 ... > 4回実行仮定:

+1

を私はいくつかの構文エラーを参照してくださいかなり確信しています。 http://shellcheck.netにあなたのコードをカット/ペーストし、見つかったエラーを修正し、あなたのQを更新してください。 – shellter

+0

ありがとう!そのサイトが存在するかどうかはわかりませんでした。それはまだif行を解析することに不満がありますが、私はなぜそれがわかりません。 if行を必要なスペースで更新しました。 – Michele

+1

'[...]'の中に '-ne'を入れたいと思っています。そして、私はシェルチェックがそれを逃したことには驚きました。コマンドラインでその行のコードを実行すると、 '-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ループをそのように入れ子にすることができます。シェルチェックを使ってチェックしようとしたとき、if行で "このテスト式を解析できませんでした"という文句があります。 – Michele

+1

@Michele: 'iptables'の出力を' echo'文の中で使うvarに変換します。つまり、 'count = $(iptables -nL INPUT | grep ACCEPT | grep dpt)です。 echo -e "stuff $ count" '.ElseはあなたのQを現在のコードで更新し、シェルチェックエラーを生成する行を強調表示します。がんばろう。 – shellter

+0

@shellter - 今質問の行にエラーメッセージを追加しました – Michele

関連する問題