我想制作一个脚本来检查服务器上的端口是否打开。如果不开放就停留一段时间。如果打开继续。使用的中断条件是“主机已启动”且未“关闭”。我认为连接没问题。问题是 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 语法相差甚远。错误消息不会告诉您具体如何修复它,但它们暗示出现了严重错误。
[[
表达]]
括号内需要有空格。看if 条件中的括号:为什么我会收到没有空格的语法错误?|
是命令之间的管道运算符。它不是一个运算符条件表达式。事实上,它被解析为通过管道传输到 command 的[[ foo | bar ]]
命令,它没有做任何有用的事情。[[ foo
bar ]]
- 这
-eq
操作员比较整数,但你放在它周围的不是整数。
要测试字符串是否包含子字符串,您可以任何一个==
在条件表达式中使用运算符,或者通过 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
时和不返回任何内容时:grep
Host is down
grep
NMAP=$(nmap -p 1700 router.eu.thethings.network)
(NMAP$ | grep "Host is up") &>/dev/null && echo "Host is up" || echo "Host is down"