在简单的nmap脚本中使用空白变量进行Bash比较

时间:2016-03-28 22:10:10

标签: bash nmap

我有一个简单的脚本,它从ip列表中找到nmaps,并返回任何打开端口80的ips。问题是80关闭,而不是没有返回,我得到" =:命令未找到"因为它试图比较空白/空变量。

#!/bin/bash
for i in$(cat filename.txt); do
 str=$(nmap $i |grep 80 | cut -d ' ' -f2)
  if($str = "open"); then
   echo port 80 on $i is open
  fi
done

当端口80关闭时,$ str没有为某个值获取任何内容,然后当我尝试将任何内容与字符串进行比较时#34;打开",即时取得" =:未找到命令&#34 ;。在将str与字符串进行比较之前,如何检查$ str是否有值?我试过了

if (! -z $str); then 

我认为这意味着

if $str is not null, then, 

但无法让它正常工作。我当然相信我理解为什么它的表现如此,我只是不知道如何纠正它。

3 个答案:

答案 0 :(得分:1)

使用GNU bash:

#!/bin/bash

port="80"

while read -r host; do
  str=$(nmap "$host" -p "$port" | grep "^$port")
  ret="${PIPESTATUS[0]}"    # returncode of nmap

  if [[ $ret != 0 ]]; then
    echo "error"
    exit 1
  fi

  # check if $str contains "open"
  if [[ $str =~ open ]]; then
    echo "port $port on $host is open"
  else
    echo "port $port on $host is not open"
  fi
done <filename.txt

我假设filename.txt每行只包含一个IP或主机名。

输出(示例):

port 80 on 10.20.30.40 is not open
port 80 on localhost is open

答案 1 :(得分:1)

这是使用netcat退出状态的版本:

#!/bin/bash

while read host; do
    nc -zw2 $host 80 &>/dev/null && state=open || state=closed
    echo "port 80 on $host is $state"
done < filename.txt

答案 2 :(得分:-1)

谢谢大家的帮助,Cyrus我非常喜欢你,比我想出的更好,而Cole我很高兴看到它用netcat完成。这是我最终到达的地方

#!/bin/bash
for i in$(cat targetlist.txt); do    --multiple people say this doesnt work
str=$(nmap -p 80 $i | grep 80 | cut -d ' ' -f2)   --im using bash 4.2.37(1)
if [[ ! -z $str && $str = "open" ]] ; then
echo port 80 on $i is open
fi
done