Bash脚本获取所有IP地址

12

我想编写一个 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


不确定我的回答是否对您有帮助,但您知道如何加速下面这个小脚本吗?它至少需要5个小时才能运行完。 - dschinn1001
12个回答

18

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}'

1
也许是 gsub(/\/.*/,"",$4) - ony
3
这是一个命令行指令,它的功能是列出所有具有全局范围的IP地址,并输出这些IP地址中的第四个字段(即不包含斜杠后面的部分)。具体指令为:ip -o addr show scope global | awk '{gsub(/\/.*/, " ",$4); print $4}' - h0tw1r3
3
ifconfig或ip?为什么不直接使用hostname -I - Scyld de Fraud
更好的 @ScylddeFraud - Pedro Lacerda

8

通过使用 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)


1
手册警告“不要对输出的顺序做任何假设。”这在问题的范围内并不重要,但如果您想使用输出中的第一个IP并假设它是eth0,则可能会有影响。 - jimp
嗯,看起来不太便携。我发现这在Ubuntu上可以工作,因为hostname是由独立的软件包hostname提供的,但在Arch上,hostname是由GNU软件包inetutils提供的,而该软件包没有--all-ip-addresses选项。 - Vladimir Panteleev
嗯,看起来不太便携。我看这在Ubuntu上可以工作,因为hostname是由独立的软件包hostname提供的,但在Arch上,hostname是由GNU软件包inetutils提供的,而该软件包没有--all-ip-addresses选项。 - undefined

7
不需要使用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 }'

获取device(如eth0, eth1等)和相应的IP地址有多难? - Justin
我会像这样更改awk部分:ifconfig | awk -F "[: ]+" '/inet addr:/ && $4 != "127.0.0.1" { print $4 }'(如果不需要的话)--- 您还可以使用-F":| +"作为分隔符。 - Yaron

2

以下是几个之前的回答和评论的总结,样例输出已包含。

列出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地址映射到主机名,请参阅此答案


1

这里有一个类似的脚本,用于获取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个小时才能完成。


0

我想向您介绍 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 = 

我觉得这更加整洁和方便。


-1
如果您只想删除“addr:”这个词,我建议使用sed而不是awk,例如:
ifconfig | grep 'inet addr:' | awk {'print $2'}| grep -v 127.0.0.1 | sed -e 's/addr://'

-1

我总是惊讶地看到人们使用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"'

最后,只需利用Perl正则表达式的威力:
ifconfig | perl -ne 'next if !/inet addr:(?<ip>[0-9.]+)/ or $+{ip} == "127.0.0.1"; print "$+{ip}\n"'

人 - 有人对 Perl 表示厌恶。我明白了... 唉。 - Gerard ONeill

-1
使用grep -v忽略127.0.0.1。
ifconfig | grep 'inet addr:' | awk {'print $2'} | grep -v '127.0.0.1'

使用sed编辑器删除'addr:'。
ifconfig | grep 'inet addr:' | awk {'print $2'}  | grep -v '127.0.0.1' | sed -e 's/addr://'

您可以使用 awk 过滤掉回环地址。 - Yaron

-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 我没有多个非环回接口的机器可以测试,欢迎分享您的发现。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接