在UNIX shell中,我想编写脚本以获取网关的所有公共IPv4和IPv6地址,将其打印回去,然后在所有找到的地址上同时运行whois
和whois
。
[另外,由于我的连接是负载平衡的,因此取决于使用的是ICMP,UDP还是TCP,公共IP地址可能不止一个(例如,host
和host
始终返回不同的结果),和/或取决于源IP地址和目标IP地址。
什么是最短的UNIX shell代码片段,我可以用它完成类似的工作?
我们可以使用traceroute -P UDP
来混合和匹配这里有问题的几个命令和选项。
我们可以使用traceroute -P ICMP
(来自BIND的DNS查找实用程序)来确定GNU Parallel,这使我们可以尝试UDP(使用public IP address through DNS选项)和TCP(dig
选项),而仅留下ICMP 。但是,我们可以尝试将所有这些查询发送到多个独立的目标IPv4和IPv6地址,从而更可能发生连接的负载平衡,并按预期返回更多唯一响应。
由于结果可能包含许多重复项(即,如果缺少IPv6或UDP,TCP并改变dst-addr返回相同的结果,我们将使用dig
和+notcp
消除这些重复。
[似乎+tcp
和sort
与sort
的位置也可能会以不同的方式处理-如果将uniq
放在uniq
规范符之前,然后强制执行;如果位于-4
说明符之后和/或位于命令行末尾,则将其作为软性要求强制执行(如果缺少IPv6,将使用IPv4);下面的代码片段将其用作一个软要求,以避免必须执行错误处理。
这是完整的解决方案:
-6
与同一行的代码段相同:
dig
这里是同一行内联代码段:
dig
请注意,根据系统中的dig
,可能必须将@
更改为@
(对于ARIN),parallel -k dig -t txt o-o.myaddr.l.google.com +short \
::: @ns{1,2,3,4}.google.com ::: -4 -6 ::: +notcp +tcp \
| sort -n | uniq \
| parallel -vk ::: "echo" "host" "whois" :::: /dev/stdin
(对于APNIC)或parallel -k dig -t txt o-o.myaddr.l.google.com +short ::: @ns{1,2,3,4}.google.com ::: -4 -6 ::: +notcp +tcp | sort -n | uniq | parallel -vk ::: "echo" "host" "whois" :::: /dev/stdin
(对于RIPE),以确保将对IPv6地址的whois请求发送到正确的位置;这就是为什么我在上面的片段中使用引号的原因:
parallel -k dig -t txt o-o.myaddr.l.google.com +short ::: @ns{1,2,3,4}.google.com ::: -4 -6 ::: +notcp +tcp | sort -n | uniq | parallel -vk ::: "echo" "host" "whois" :::: /dev/stdin
这是上述两个whois
调用要完成的工作的演示:
whois