我想编写一个 bash
脚本以获取服务器上的所有IP地址。该脚本应该适用于主流的Linux发行版。以下是我目前的脚本:
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}'
gsub(/\/.*/,"",$4)
? - onyip -o addr show scope global | awk '{gsub(/\/.*/, " ",$4); print $4}'
- h0tw1r3hostname -I
? - Scyld de Fraud通过使用 hostname
命令,您可以使用 -I
参数获取所有 IP 地址的列表。
例如:
$ 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)
hostname
是由独立的软件包hostname
提供的,但在Arch上,hostname
是由GNU软件包inetutils
提供的,而该软件包没有--all-ip-addresses
选项。 - Vladimir Panteleevhostname
是由独立的软件包hostname
提供的,但在Arch上,hostname
是由GNU软件包inetutils
提供的,而该软件包没有--all-ip-addresses
选项。 - undefinedgrep
。这里有一种使用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 }'
device
(如eth0, eth1等)和相应的IP地址有多难? - Justinawk
部分:ifconfig | awk -F "[: ]+" '/inet addr:/ && $4 != "127.0.0.1" { print $4 }'
(如果不需要的话)--- 您还可以使用-F":| +"
作为分隔符。 - Yaron以下是几个之前的回答和评论的总结,样例输出已包含。
列出IP地址:
使用ip
命令:
(仅限IPv4和全局IP地址)
$ /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地址映射到主机名,请参阅此答案。
这里有一个类似的脚本,用于获取IP地址范围,但速度较慢 - 有人可能会给出提示,如何加速?(这里的IP范围是获取所有在线的线路示例 - 从温哥华到韩国之间):
#!/bin/bash
for ip in {209..210}.{125..206}.{5..231}.{65..72} #在209.126.230.71和210.205.6.66之间的任何IP
do
printf ' === %s ===\n' "$ip"
whois "$ip" >> /home/$user/test001.txt
done
如果这太简单或者有错误,请简单回答或评论。
这个脚本需要大约5到8个小时才能完成。
我想向您介绍 Facebook 推出的命令行工具 OSQuery,它可以通过类似 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 =
我觉得这更加整洁和方便。
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 替换 Awk:
ifconfig | grep 'inet addr:' | perl -F\\s\|: -ane 'print "$F[2]\n"' | grep -v '127.0.0.1'
在同一个 Perl 脚本中替换 greps:
ifconfig | perl -F\\s\|: -ane 'next if !/^inet addr:/ or /127\.0\.0\.1/; print "$F[2]\n"'
ifconfig | perl -ne 'next if !/inet addr:(?<ip>[0-9.]+)/ or $+{ip} == "127.0.0.1"; print "$+{ip}\n"'
ifconfig | grep 'inet addr:' | awk {'print $2'} | grep -v '127.0.0.1'
ifconfig | grep 'inet addr:' | awk {'print $2'} | grep -v '127.0.0.1' | sed -e 's/addr://'
awk
过滤掉回环地址。 - Yaron这是一个非常棘手的解决方案,但它确实有效:
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
我没有多个非环回接口的机器可以测试,欢迎分享您的发现。