不知道是否在任何被阻止的事件中打开端口/协议的shell脚本是正确的

不知道是否在任何被阻止的事件中打开端口/协议的shell脚本是正确的

问题描述:

我正在编写一个脚本来检查/打开任何阻塞的端口/协议。我到目前为止已经在下面。端口/协议名称对我来说看起来很奇怪。我会预期IP地址,但我从来没有这样做过。主机是否是DSLAM的IP地址?另外,如果它是当前机器,我可以在不指定主机的情况下运行nc吗?否则,这个脚本是否需要做什么?不知道是否在任何被阻止的事件中打开端口/协议的shell脚本是正确的

#!/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

+1

我敢肯定,我看到一些语法错误。将你的代码剪切/粘贴到http://shellcheck.net,更正它找到的任何错误,然后更新你的Q.祝你好运。 – shellter

+0

谢谢!我不知道该网站存在。它仍在抱怨解析if行,但我不知道为什么。我更新了if行所需的空格。 – Michele

+1

我想你想在''[']''里面有'-ne'。我惊讶于shellcheck错过了这一点。当我在命令行上运行这行代码时,会得到'-ksh:[:ne:unknown operator',但是'ksh'。没有当前的'bash'来测试。祝你好运。 – shellter

  1. 这些线看上去很奇怪,OP edit #6增加了一个外for环的相同的值分配给$HOST每个去轮:

    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 ... >四次是没有必要的,然后 的如上所述,以上七行将等同于:

    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

非常感谢!我没有意识到这一点。我相应地更新了代码。我还添加了主机数组。希望我能以这种方式嵌套我的循环。当我尝试使用shellcheck检查它时,它在if行上抱怨“无法解析此测试表达式”。 – Michele

+1

@Michele:我会将'iptables'输出转换成你在'echo'语句中使用的var。即'count = $(iptables -nL INPUT | grep ACCEPT | grep dpt); echo -e“stuff $ count”'。请使用当前代码更新您的Q,并突出显示生成shellcheck错误的行。祝你好运。 – shellter

+0

@shellter - 我现在在问题中添加了错误信息 – Michele