Bash脚本检查给定IP是否有效为主机记录

时间:2013-07-02 18:14:19

标签: regex bash grep

我需要使用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,每行一个。

如何使这项工作?

1 个答案:

答案 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,我更倾向于使用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。