Shell 在UNIX主机的所有公共IPv4和IPv6地址上运行“whois”和“host”

Shell 在UNIX主机的所有公共IPv4和IPv6地址上运行“whois”和“host”,shell,ip-address,xargs,gnu-parallel,dig,Shell,Ip Address,Xargs,Gnu Parallel,Dig,在unixshell中,我想编写脚本获取网关的所有公共IPv4和IPv6地址,将其打印回来,然后在所有找到的地址上运行和 此外,由于我的连接是负载平衡的,因此可能有多个公共IP地址,这取决于使用的是ICMP、UDP还是TCP(例如,traceroute-p UDP和traceroute-p ICMP始终返回不同的结果),和/或取决于源和目标IP地址 最短的UNIX shell代码段是什么,我可以用它完成类似的任务?解释 我们可以使用它来混合和匹配一些关键的命令和选项 我们可以使用(来自BIND的

在unixshell中,我想编写脚本获取网关的所有公共IPv4和IPv6地址,将其打印回来,然后在所有找到的地址上运行和

此外,由于我的连接是负载平衡的,因此可能有多个公共IP地址,这取决于使用的是ICMP、UDP还是TCP(例如,
traceroute-p UDP
traceroute-p ICMP
始终返回不同的结果),和/或取决于源和目标IP地址

最短的UNIX shell代码段是什么,我可以用它完成类似的任务?

解释 我们可以使用它来混合和匹配一些关键的命令和选项

我们可以使用(来自BIND的DNS查找实用程序)确定,这让我们可以同时尝试UDP(使用
+notcp
选项)和TCP(
+TCP
选项),只留下ICMP。但是,我们可以尝试将所有这些查询发送到多个独立的目标IPv4和IPv6地址,从而更有可能实现连接的负载平衡,并像预期的那样返回更独特的响应

由于结果可能包含许多重复项(即,如果IPv6丢失,或者如果UDP、TCP和不同的dst addr返回相同的结果),我们将使用和来消除这些重复项

看起来,
-4
-6
的定位也可能会有不同的处理方式-如果定位在
挖掘
之后的
@
说明符之前,那么这是一项硬要求;如果定位在
@
说明符之后和/或命令行末尾,则作为软要求强制执行(如果缺少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,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,2,3,4}.google.com:::-4-6::+notcp+tcp | sort-n | uniq | parallel-vk::“echo”“host”“whois::::/dev/stdin

请注意,根据您的系统,您可能必须将
“whois”
更改为类似
“whois-a”
(对于ARIN)、
whois-a
(对于APNIC)或
“whois-r”
(对于RIME)的内容,以确保将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-a:::/dev/stdin

测试 下面演示了上面两个调用的作用:

% parallel -k echo dig -t txt o-o.myaddr.l.google.com +short \
? ::: @ns{1,2,3,4}.google.com ::: -4 -6 ::: +notcp +tcp
dig -t txt o-o.myaddr.l.google.com +short @ns1.google.com -4 +notcp
dig -t txt o-o.myaddr.l.google.com +short @ns1.google.com -4 +tcp
dig -t txt o-o.myaddr.l.google.com +short @ns1.google.com -6 +notcp
dig -t txt o-o.myaddr.l.google.com +short @ns1.google.com -6 +tcp
dig -t txt o-o.myaddr.l.google.com +short @ns2.google.com -4 +notcp
dig -t txt o-o.myaddr.l.google.com +short @ns2.google.com -4 +tcp
dig -t txt o-o.myaddr.l.google.com +short @ns2.google.com -6 +notcp
dig -t txt o-o.myaddr.l.google.com +short @ns2.google.com -6 +tcp
dig -t txt o-o.myaddr.l.google.com +short @ns3.google.com -4 +notcp
dig -t txt o-o.myaddr.l.google.com +short @ns3.google.com -4 +tcp
dig -t txt o-o.myaddr.l.google.com +short @ns3.google.com -6 +notcp
dig -t txt o-o.myaddr.l.google.com +short @ns3.google.com -6 +tcp
dig -t txt o-o.myaddr.l.google.com +short @ns4.google.com -4 +notcp
dig -t txt o-o.myaddr.l.google.com +short @ns4.google.com -4 +tcp
dig -t txt o-o.myaddr.l.google.com +short @ns4.google.com -6 +notcp
dig -t txt o-o.myaddr.l.google.com +short @ns4.google.com -6 +tcp
%
% printf '"%s"\n"%s"\n"%s"\n"%s"' "127.0.0.1" "127.0.0.1" "::1" "::1" \
? | sort -n | uniq \
? | parallel -k echo ::: "echo" "host" "whois -a" :::: /dev/stdin
echo "127.0.0.1"
echo "::1"
host "127.0.0.1"
host "::1"
whois -a "127.0.0.1"
whois -a "::1"
%