我需要使用cron和bash来检查IP 111.222.333.444是否仍然对主机sub.domain.com有效。
我用-Pzo尝试了 grep ,但它没有用。我不想安装 pcregrep 。
#!/bin/bash
ipaddressused=$1
#Run a dig for sub.domain.com:
ipaddresscurrent='dig +short sub.domain.com'
echo "$ipaddresscurrent" | grep -Pzo "$ipaddressused" && echo "found" && exit 0 || echo "not found" && exit 1
ipaddresscurrent 返回多个IP,每行一个。
如何使这项工作?
答案 0 :(得分:2)
这不够吗?
#!/bin/bash
ipaddressused=$1
if grep -q -P "$ipaddressused" < <(dig +short sub.domain.com); then
echo "found"
exit 0
else
echo "not found"
exit 1
fi
你的剧本出了什么问题?
该行
ipaddresscurrent='dig +short sub.domain.com'
将字符串dig +short sub.domain.com
分配给变量ipaddresscurrent
。相反,您可能希望将命令 ipaddresscurrent
的输出分配给变量dig +short sub.domain.com
。这可以使用旧的和不推荐的反引号来完成:
ipaddresscurrent=`dig +short sub.domain.com`
(但请不要使用反引号!)或更现代,更强大且可嵌套的$(...)
:
ipaddresscurrent=$(dig +short sub.domain.com)
grep -Pzo
并没有真正做到你所期望的。相反,您想要grep
快速运行(因此-q
标志)并检查其输出,以便以下内容有效:
echo "$ipaddresscurrent" | grep -q -P "$ipaddressused" && echo "found" && exit 0 || echo "not found" && exit 1
由于您并不真正需要变量ipaddresscurrent
,我更倾向于使用bash的process substitution来提供grep
。
此外,不要使用&& || &&
的长链,它很难阅读,并且可能会产生一些微妙的副作用。
如果您想坚持使用变量,则需要here-string,因为:
#!/bin/bash
ipaddressused=$1
ipaddresscurrent=$(dig +short sub.domain.com)
if grep -q -P "$ipaddressused" <<< "$ipaddresscurrent"; then
echo "found"
exit 0
else
echo "not found"
exit 1
fi
正如您在评论中所说:
应该注意的是,如果提供的$ ipaddressused是111.222.333.4并且列表中存在111.222.333.456,则也会发生匹配。这可能会导致问题。
我实际上并不知道这是否是一个请求的功能(因为脚本的参数是一个正则表达式,这实际上是我留下-P
标志的原因)。如果您真的想要与IP完全匹配,请按以下步骤操作:
#!/bin/bash
if grep -q "^${1//./\.}$" < <(dig +short sub.domain.com); then
echo "found"
exit 0
else
echo "not found"
exit 1
fi
假设dig
使用这种方式每行只输出一个ip。