Nmap 检查端口是否在 bash 中打开

Nmap 检查端口是否在 bash 中打开

我想制作一个脚本来检查服务器上的端口是否打开。如果不开放就停留一段时间。如果打开继续。使用的中断条件是“主机已启动”且未“关闭”。我认为连接没问题。问题是 grep 没有按预期工作。

我尝试过以下操作:

while true; do
 NMAP=$(nmap -p 1700 router.eu.thethings.network)
 if [[$NMAP | grep "Host is up" -ne ""]] && [[$NMAP | grep "closed" -eq ""]]; then
    echo "connection!!!"
    break
 fi


 echo "waiting for connectiong"
 done

我在树莓派杰西系统上运行它。

答案1

nmap -p 1700 router.eu.thethings.network

如果主机网络已启动并且端口上没有任何监听,将打印“Host is up”。改用nc

if nc -w1 -z router.eu.thethings.network 1700; then
  echo "Port is listening"
else
  echo "Port is not listening"
fi

答案2

问题是这[[$NMAP | grep "Host is up" -ne ""]]与有效的 bash 语法相差甚远。错误消息不会告诉您具体如何修复它,但它们暗示出现了严重错误。

要测试字符串是否包含子字符串,您可以任何一个==在条件表达式中使用运算符,或者通过 grep 的管道(不涉及条件表达式)。使用 grep,您不是$NMAP作为命令运行,而是希望将其作为输入传递给 grep,因此您需要将echo其放入管道中。传递-q给 grep 因为您只关心它的返回状态,而不关心它的输出。

if echo "$NMAP" | grep "Host is up"  && echo "$NMAP" | grep "closed"; then …

使用条件表达式:

if [[ $NMAP == *"Host is up"* || $NMAP == *"closed"* ]]; then …

一定要读对运算符感到困惑 [[ vs [ vs ( vs ((它解释了条件表达式以及它们为什么不是测试条件是否为真的唯一方法。另外,请阅读为什么我的 shell 脚本会因为空格或其他特殊字符而卡住?

答案3

有一个示例显示成功Host is up时和不返回任何内容时:grepHost is downgrep

NMAP=$(nmap -p 1700 router.eu.thethings.network)
(NMAP$ | grep "Host is up") &>/dev/null && echo "Host is up" || echo "Host is down"

相关内容