首页 > 解决方案 > 运行 traceroute 和 traceroute6 的最短 shell 代码

问题描述

我想在 shell 脚本中依次运行traceroute -w2traceroute6 -w2来尝试多个不同的主机。

一种天真的方法可能只是使用一个临时变量来收集其中的所有主机(例如,设置HOSTSordns.he.net one.one.one.one google-public-dns-a.google.com),然后将其单独通过管道传递给每个命令,例如echo $HOSTS | xargs -n1 traceroute -w2等,但这在tcsh与 in 中的工作方式不同bash,并且可能很容易如果您想添加更多命令(因为您会将这些命令添加为代码而不是要做的事情列表),我认为有一些更好的方法可以将命令列表连接在一起(例如,a带有单个参数的命令名称)和参数列表(例如,我们示例中的主机名),以便 shell 执行每个可能的组合。

我尝试过将xargs -n1(对于主机)和xargs -n2(对于带有一个参数的命令)管道进行某种组合,但这并没有多大意义,也没有奏效。

我正在寻找一种不使用任何 GNU 工具并且可以在基本 OpenBSD 安装中工作的解决方案(如有必要,perl它是基本 OpenBSD 的一部分,因此它也可用)。

标签: shellperlxargstcsh

解决方案


保持简单:

#!/bin/sh
set -- host1 host2 host3 host4 ...
for host do traceroute -w2 -- "$host"; done
for host do traceroute6 -w2 -- "$host"; done

推荐阅读