在 bash 脚本的 if 语句中使用 traceroute

Posted

技术标签:

【中文标题】在 bash 脚本的 if 语句中使用 traceroute【英文标题】:Using traceroute in an if statement in a bash script 【发布时间】:2019-03-08 18:00:34 【问题描述】:

我正在尝试根据 traceroute 是否从特定 IP 地址获得响应来执行代码。所以:

if traceroute 123.456.78.9
then
   option 1
else
   option 2

我的问题是,无论我是否从 IP 地址得到响应,选项 1 总是被执行。

我已经尝试使用 'ping' 而不是 traceroute 并且它有效,但我没有在最终代码中使用 ping 的选项。

更多详情:

    在 QNX 操作系统上运行 成功由主机响应构成,失败由主机无响应构成

    成功输出:

    traceroute to 123.456.78.9 (123.456.78.9), 1 hops max, 40 byte packets
     1  123.456.78.9 (123.456.78.9)  0.000 ms  1.000 ms  0.000 ms
    

    失败输出:

    traceroute to 123.456.78.90 (123.456.78.90), 1 hops max, 40 byte packets
     1  *
    

【问题讨论】:

运行traceroute 123.456.78.9,然后echo $?检查退出状态。如果是0,则视为成功。如果是1,则视为失败。 如果 traceroute 在退出时总是报告成功,即使它无法到达远程系统,请向您的操作系统供应商提出 - 他们是为您提供 traceroute 的人;它不是 bash 的一部分。 OTOH,如果您想读取 traceroute 的标准输出并从那里确定成功或失败,我们可以这样做,但是您需要在您的问题中提供 much 更多信息(特别是成功的示例输出和失败案例,以及您期望构成失败的详细信息)。如果没有这些详细信息,答案可能只能在回答者运行的操作系统上运行。 感谢您的回复。我根据您的评论添加了更多详细信息。另外,我不确定如何使用上面提到的 echo $ 检查退出状态。 echo $?? 是其中的一部分。比较 true; echo $?false; echo $?。您会看到前者为 0(退出状态,if 和其他条件将视为成功),后者为 1(与任何其他非零值一样,被视为失败)。 【参考方案1】:

问题是即使没有有效的主机,traceroute 总是会回显输出,因此您需要先检查有效响应

您必须检查是否收到了有效的响应

尝试使用

n=`traceroute 123.456.78.9|grep ms|wc|sed 's/ //g' |cut -d ' ' -f 1`

if [ $n -eq 0 ]                                                         
then
    echo 'failed'
else
    echo 'success'
fi

【讨论】:

如果ms只能在成功案例中找到,那不就是if traceroute 123.456.78.9 | grep -q ' ms'; then echo success; else echo failed; fi吗?管道似乎有点矫枉过正。 (另外,正如shellcheck.net 所指出的,最好引用扩展,如[ "$n" -eq 0 ];这样,如果你以某种方式最终得到n 的空值,你会得到一个来自test 的更有用的错误消息)。 感谢您的改进

以上是关于在 bash 脚本的 if 语句中使用 traceroute的主要内容,如果未能解决你的问题,请参考以下文章

在 Bash 中检查 sudo(带有 if 语句的脚本)

bash脚本中 if 语句 和 for 语句的用法

在 if elif else 语句中具有逻辑与和 ors 的 Bash 脚本

Linux bash/sh/shell编程中的if语句应该怎么写

Bash脚本,if语句[关闭]

bash循环语句