在 Linux 上 Ping 服务器/域并捕获其 IP

ICE*_*ICE 7 bash ping ip

使用 Windows,即使没有收到回复,您也可以 ping 给定的域名并将 IP 作为变量捕获。我相信命令看起来像这样:

ping domain.com
for /f "tokens=1,2 delims=[]" %%A in ('ping /n 1 /w 1 domain.com ^| find "Pinging"') do set ipaddress=%%B"`
Run Code Online (Sandbox Code Playgroud)

这基本上就是我想要做的,但是在 bash 脚本而不是批处理文件中。我偶然发现了很多非常接近的问题,但并不是我想要的。我似乎无法找出解决此问题的最佳方法。

有任何想法吗?

ter*_*don 14

这应该可以从命令行或脚本中工作:

ip=$(ping -c 1 www.google.com | gawk -F'[()]' '/PING/{print $2}')
echo $ip
173.194.34.19
Run Code Online (Sandbox Code Playgroud)

解释

首先是ping被解析命令的输出:

$ ping -c 1 www.google.com
PING www.google.com (173.194.40.209) 56(84) bytes of data.
64 bytes from par10s12-in-f17.1e100.net (173.194.40.209): icmp_req=1 ttl=52 time=49.8 ms

--- www.google.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 49.874/49.874/49.874/0.000 ms
Run Code Online (Sandbox Code Playgroud)
  • ip=$(COMMAND): 将 的输出分配给COMMAND变量$ip
  • ping -c 1 www.google.com : ping google,一次。
  • gawk 是一种强大的脚本语言,可以逐行处理输入,逐字段处理。
  • -F'[()]':-F设置gawk字段分隔符。在这里,我们将其设置为字符类 ( [ ]),专门用于打开和关闭括号。这意味着直到第一个)(将是第一个字段的所有内容gawk都是$1. 我们只对第一行感兴趣,所以我们告诉gawk打印第二个字段 ( $2),即 IP,当当前行包含“PING” ( /PING/) 时。

因此,整个shebang的结果都保存为ip,然后您可以将其引用为$ip

  • @Jim 你可以用 `awk` 替换 `gawk` 以使其更便携。`gawk` 可能没有安装在某些 UNIX 上,但 `awk` 应该总是在那里。 (4认同)