不确定在任何端口/协议被阻止的情况下打开端口/协议的shell脚本是否正确

不确定在任何端口/协议被阻止的情况下打开端口/协议的shell脚本是否正确,shell,unix,port,protocols,Shell,Unix,Port,Protocols,我正在编写一个脚本,它将在任何端口/协议被阻止时检查/打开端口/协议。到目前为止,我所了解的情况如下。端口/协议名称在我看来很奇怪。我本来希望有IP地址,但我以前从未这样做过。主机是DSLAM的IP地址吗?另外,如果是当前机器,是否可以在不指定主机的情况下运行nc?否则,此脚本是否执行所需的操作 #!/bin/bash PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin echo -e "############

我正在编写一个脚本,它将在任何端口/协议被阻止时检查/打开端口/协议。到目前为止,我所了解的情况如下。端口/协议名称在我看来很奇怪。我本来希望有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
我指的是,而且也是

  • 这些行看起来很奇怪,为循环添加了一个外部
    ,它在每次循环中为
    $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
    
    bash
    不使用逗号定义数组,如果使用逗号 它们成为数组数据中的字符。例如,给定数组 正如上面所说:

    echo ${PORTS[0]}
    
    产出:

    123,
    
  • 这些行看起来很奇怪,为循环添加了一个外部
    ,它在每次循环中为
    $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
    
    bash
    不使用逗号定义数组,如果使用逗号 它们成为数组数据中的字符。例如,给定数组 正如上面所说:

    echo ${PORTS[0]}
    
    产出:

    123,
    

  • 我很确定我看到了一些语法错误。将您的代码剪切/粘贴到中,更正发现的任何错误,然后更新您的Q。祝您好运。我想您希望
    -ne
    位于
    […]
    的内部。我很惊讶shellcheck没有看到。当我在命令行上只运行那一行代码时,我得到了
    -ksh:[:ne:unknown operator
    ,但那是
    ksh
    。没有当前的
    bash
    来测试。祝你好运。
    #!/bin/bash
    需要出现在第1行(对于shellcheck.net和bash脚本内部)。我处理端口的经验有限,不想给出不好的建议。例如,我必须去维基百科看看DSLAM是什么;-)。一般来说,如果你能通过测试证明打开/关闭的端口标记正确,我会假设你有一个工作脚本。哎哟,
    {…}
    &&
    完全不可见后的
    块。你应该能够将它移到下面,使代码更可读。根据你的需要,有许多更有效的工具可以测试端口。例如,在你的android手机上加载
    fing
    。祝你好运。你可以破解
    {…}
    字符上阻止代码。但至少知道读者知道代码存在;-)。此外,请查看
    nmap
    utils(广泛可用,但需要重新思考您的问题/解决方案)。祝你好运。我很确定我看到了一些语法错误。剪切/粘贴你的代码,更正它发现的任何错误,然后更新你的Q。祝你好运。我想你想要
    -ne
    […]
    中。我很惊讶shellcheck没有看到。当我在命令行上只运行那行代码时,我得到
    -ksh:[:ne:unknown operator
    ,但那是
    ksh
    。没有当前的
    bash
    进行测试。祝你好运。
    #!/bin/bash
    需要出现在第1行(对于shellcheck.net和bash脚本内部)。我处理端口的经验有限,不想给出不好的建议。例如,我必须去维基百科看看DSLAM是什么;-)。一般来说,如果你能通过测试证明打开/关闭的端口标记正确,我会假设你有一个工作脚本。哎哟,
    {…}
    &&
    完全不可见后的
    块。你应该能够将它移到下面,使代码更可读。根据你的需要,有许多更有效的工具可以测试端口。例如,在你的android手机上加载
    fing
    。祝你好运。你可以破解
    {…}
    字符上阻止代码。但至少知道读者知道代码存在;-)。此外,请查看
    nmap
    utils(广泛可用,但需要重新思考您的问题/解决方案)。祝你好运。非常感谢!我没有意识到这一点。我相应地更新了代码。我还添加了主机数组。希望我可以用这种方式嵌套for循环。当我尝试使用shellcheck进行检查时,它抱怨“无法解析此测试表达式”在if行。@Michele:我将把
    iptables
    输出转换成一个var,您可以在
    echo
    语句中使用它。例如
    count=$(iptables-nL-INPUT | grep-ACCEPT | grep-dpt);echo-e“stuff$count”
    。否则,请使用当前代码更新Q,并突出显示生成shellcheck错误的行。祝您好运。@shellter-我在问题行中添加了错误消息,非常感谢!我没有意识到这一点。我相应地更新了代码。我还添加了主机数组。希望我能以这种方式嵌套for循环。当我尝试我们时为了检查它,它抱怨在if行上“无法解析这个测试表达式”。@Michele:我会将
    iptables
    输出转换成一个var,您在
    echo
    语句中使用它。例如
    count=$(iptables-nL-INPUT | grep ACCEPT | grep dpt);echo-e“stuff$count”
    。否则,请使用当前代码更新您的Q,并突出显示生成shellcheck错误的行。祝您好运。@shellter-我现在已将错误消息添加到问题的行中