Yok*_*kai 4 administration sed tr
我制作了一个在服务器上运行的 Bash 工具。此工具将在特定时间范围内(即从早上 5 点到下午 3 点 30 分)阻止某些 IP 地址。
目前,该工具工作正常,但我必须手动将某些网站的 IP 地址输入到文本文件中,并让该工具使用“head”和“tail”命令根据第 n 行提取 IP 地址。我不想这样做,因为我相信单个 ping 会更加轻便和便携。因此,如果我为 Google 执行 ping 操作:
ping google.com -c 1 -s 16
Run Code Online (Sandbox Code Playgroud)
输出将是:
Ubuntu@yokai:~# ping google.com -c 1 -s 16
PING google.com (173.194.66.138) 16(44) bytes of data.
24 bytes from qo-in-f138.1e100.net (173.194.66.138): icmp_seq=1 ttl=37 time=46.7 ms
--- google.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 46.748/46.748/46.748/0.000 ms
Run Code Online (Sandbox Code Playgroud)
我缩小这个输出的命令是:
ping google.com -c 1 -s 16 | grep -o '([^ ]*' | tr -d '(44):\n'
Run Code Online (Sandbox Code Playgroud)
这给了我一个输出:
173.19.66.113173.19.66.113ubuntu@yokai
Run Code Online (Sandbox Code Playgroud)
如您所见,存在相同 IP 地址的重复项。如何使用 sed 删除重复项,以便我可以将单个 IP 地址存储到变量中并将脚本作为 cronjob 运行,或者我是否使用 tr 处于更好的轨道?
(编辑)
我已经知道/知道如何从主机名或域解析 IP 地址。这不是我在这里问的。这个问题特别是关于使用 sed 管理 ping 输出,以保持我创建的工具更具便携性,因为 ping 几乎是所有 Linux 发行版的默认设置。
(更新)由于有些人将此问题标记为与其他一些与此无关的废话问题的重复,因此我将足够清楚地说明有英语理解问题的迟钝者可以理解:
如何解析的IP地址“ONLY”从ping
OUTPUT当使用ping
一个域名。
这不是要求解析域名,因此不是重复的!!!
(最新更新)自从问这个问题以来,我学习了正确的 POSIX 正则表达式来做我需要的事情,我需要明确表示我最初是在询问正则表达式,sed
它会从 ping 输出打印 IP 的单个实例. 从那以后,我改进了我的方法,并没有使用这里的任何答案,但我感谢每个人在这里提供帮助的尝试。我现在正在使用我创建的计时器脚本来在某些时间配置 iptables 以阻止某些域名解析。再次感谢所有试图提供帮助的人。
hee*_*ayl 15
ping
用于根据 ICMP 响应检查主机是启动还是关闭,它永远不是仅解析 IP 地址的正确工具,有专门的工具可以解决这个问题。
你应该看看dig
, host
, nslookup
- 任何最适合你的东西。
这是一个dig
输出:
% dig +short google.com
123.108.243.57
123.108.243.51
123.108.243.54
123.108.243.48
123.108.243.60
123.108.243.52
123.108.243.56
123.108.243.55
123.108.243.61
123.108.243.58
123.108.243.49
123.108.243.50
123.108.243.59
123.108.243.47
123.108.243.53
Run Code Online (Sandbox Code Playgroud)
附带说明一下,在 Linux 中,如果您想通过 NSSwitch(名称服务交换机)ie 进行查询/etc/nsswitch
,请使用getent
带有hosts
(或ahosts
)数据库的命令,例如:
getent hosts google.com
Run Code Online (Sandbox Code Playgroud)
在我的电脑中,我有:
hosts: files mdns4 dns
Run Code Online (Sandbox Code Playgroud)
in /etc/nsswitch.conf
,因此getent hosts
将按顺序查询并使用gethostbyaddr(3)
或gethostbyname(3)
基于名称ahosts
将使用getaddrinfo(3)
.
本质上,根据我的配置,这将首先检查/etc/hosts
,然后是 mDNS,最后是 DNS。
如果你坚持使用ping
and sed
,你可以这样做:
% ping -c1 google.com | sed -nE 's/^PING[^(]+\(([^)]+)\).*/\1/p'
123.108.243.56
Run Code Online (Sandbox Code Playgroud)
浏览谷歌我找到了另一个unix.SE 帖子的链接,提到了getent
- 我什至不知道这个程序存在。
您可以使用getent
likedig
将 IP 解析为主机名 - 我的系统getent
默认已安装,但未安装dig
. 如果您想要 ipv6 主机,请更改ahostsv4
为ahostsv6
.
getent ahostsv4 google.com | awk '{print $1}' | head -1
Run Code Online (Sandbox Code Playgroud)
我添加了这个答案,因为我不擅长正则表达式 / sed 并且无法想出@heemayl 的答案。