我正在尝试编写一个bash
脚本来获取服务器上的所有 IP 地址。该脚本应该适用于所有主要发行版。这是我所拥有的:
ifconfig | grep 'inet addr:' | awk {'print $2'}
导致:
addr:10.1.2.3
addr:50.1.2.3
addr:127.0.0.1
如何首先删除addr:
前缀?其次,我该如何排除127.0.0.1
?
ifconfig
被淘汰了ip
。它还具有-o
写输出易于解析的标志。用于ip -4
仅显示 IPV4 地址。注意更简单的脚本,它已经排除了环回地址:
ip -o addr | awk '!/^[0-9]*: ?lo|link\/ether/ {print $2" "$4}'
或者,如果您不想要网络:
ip -o addr | awk '!/^[0-9]*: ?lo|link\/ether/ {gsub("/", " "); print $2" "$4}'
没有必要grep
。这是一种使用方法awk
:
仅列出地址:
ifconfig | awk -F "[: ]+" '/inet addr:/ { if ($4 != "127.0.0.1") print $4 }'
列出设备和地址:
ifconfig | awk -v RS="\n\n" '{ for (i=1; i<=NF; i++) if ($i == "inet" && $(i+1) ~ /^addr:/) address = substr($(i+1), 6); if (address != "127.0.0.1") printf "%s\t%s\n", $1, address }'
只需使用该标志hostname
,您就可以获得所有 IP 地址的列表。-I
IE
$ hostname --all-ip-addresses || hostname -I
10.10.85.100 10.20.85.100 10.30.85.100
然而
$ hostname --ip-address || hostname -i
::1%1 127.0.0.1
Centos7 (k3.10.0)
这是一个类似的脚本,用于我测试过的获取 IP 地址范围的内容,但速度很慢 - 有人可能会给出提示,如何加速?(这里的 ip-range 是获取所有线路的示例,似乎在温哥华和韩国之间):
#!/bin/bash
for ip in {209..210}.{125..206}.{5..231}.{65..72} # 209.126.230.71 和 210.205.6.66 之间的任何 ip
做
printf ' === %s ===\n' "$ip"
whois "$ip" >> /home/$user/test001.txt
完毕
如果这里太琐碎或有错误,只需回答或评论。
这个脚本将持续到完成大约 5 到 8 个小时。
这只是对先前几个答案和评论的提炼。包括样本输出。
要列出 IP:
使用ip
:
(仅限于 IPv4 和全球)
$ /sbin/ip -4 -o addr show scope global | awk '{gsub(/\/.*/,"",$4); print $4}'
192.168.82.134
138.225.11.92
138.225.11.2
使用ifconfig
:
(不包括 127.0.0.1)
$ /sbin/ifconfig | awk -F "[: ]+" '/inet addr:/ { if ($4 != "127.0.0.1") print $4 }'
192.168.82.134
138.225.11.92
138.225.11.2
要将 IP 映射到主机名,请参阅此答案。
使用 grep -v 忽略 127.0.0.1
ifconfig | grep 'inet addr:' | awk {'print $2'} | grep -v '127.0.0.1'
使用 sed 编辑掉“地址:”
ifconfig | grep 'inet addr:' | awk {'print $2'} | grep -v '127.0.0.1' | sed -e 's/addr://'
ifconfig | grep 'inet addr:' | awk {'print $2'} | awk 'BEGIN{FS=":"}{print $2}' | grep -v '127.0.0.1'
这是一个非常棘手的解决方案,但它有效:
ip a | awk ' !/[0-9]+\: lo/ && /^[0-9]\:/ || /inet / && !/127\.0\.0\.1/ {print $2}'
输出:
eth0:
192.168.0.1/24
更好的是:
ip a | awk ' !/[0-9]+\: lo/ && /^[0-9]\:/ || /inet / && !/127\.0\.0\.1/ {print $2}' | perl -i -pe "s/:\n/: /g;" -pe "s/\/[\d]+$//"
输出:
eth0: 192.168.0.1
我没有可以检查它的具有多个非环回接口的机器,请随时发布您的发现。
如果它只是你想删除的“地址:”这个词,我会使用sed
而不是awk
喜欢
ifconfig | grep 'inet addr:' | awk {'print $2'}| grep -v 127.0.0.1 | sed -e 's/addr://'
看到人们使用 sed 和 awk 而不是 perl,我总是很惊讶。
但首先,将 grep 和 awk 与一个额外选项一起使用,请随意:
ifconfig | grep 'inet addr:' | awk {'print $2'} | awk -F: {'print $2'} | grep -v '127.0.0.1'
用 perl 替换 awks:
ifconfig | grep 'inet addr:' | perl -F\\s\|: -ane 'print "$F[2]\n"' | grep -v '127.0.0.1'
替换同一 perl 脚本中的 grep:
ifconfig | perl -F\\s\|: -ane 'next if !/^inet addr:/ or /127\.0\.0\.1/; print "$F[2]\n"'
最后只是使用 perl 正则表达式的强大功能:
ifconfig | perl -ne 'next if !/inet addr:(?<ip>[0-9.]+)/ or $+{ip} == "127.0.0.1"; print "$+{ip}\n"'
我想向您介绍一个名为OSQuery的 Facebook 命令行工具,它可以帮助您通过进行类似 SQL 的查询来获取系统信息。例如,对于您的情况,您应该输入;
osquery> select * from interface_addresses;
哪个会输出类似的东西;
interface = wlan0
address = 192.168.0.101
mask = 255.255.255.0
broadcast = 192.168.0.255
point_to_point =
我发现它更加整洁和方便。
ifconfig | grep 'inet addr:' | awk {'print $2'} | cut -d ":" -f 2