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