我有一个简单的脚本,它从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,
但无法让它正常工作。我当然相信我理解为什么它的表现如此,我只是不知道如何纠正它。
答案 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