获取所有IP地址的Bash脚本

Jus*_*tin 10 linux bash shell

我正在尝试编写一个bash脚本来获取服务器上的所有IP地址.该脚本应适用于所有主要发行版.这是我有的:

ifconfig | grep 'inet addr:' | awk {'print $2'}
Run Code Online (Sandbox Code Playgroud)

导致:

addr:10.1.2.3
addr:50.1.2.3
addr:127.0.0.1
Run Code Online (Sandbox Code Playgroud)

我怎么能先删除addr:前缀?第二,我怎么能排除127.0.0.1

Ped*_*rda 14

ifconfig被淘汰了ip.它还具有-o写输出易于解析的标志.用于ip -4仅显示IPV4地址.注意更简单的脚本,它已经排除了环回地址:

ip -o addr | awk '!/^[0-9]*: ?lo|link\/ether/ {print $2" "$4}'
Run Code Online (Sandbox Code Playgroud)

或者如果您不想要网络:

ip -o addr | awk '!/^[0-9]*: ?lo|link\/ether/ {gsub("/", " "); print $2" "$4}'
Run Code Online (Sandbox Code Playgroud)

  • `ip -o addr show scope global | awk'{gsub(/\/.*/,"",$ 4); 打印$ 4}'` (3认同)
  • ifconfig还是ip?为什么不使用`hostname -I`? (2认同)

Ste*_*eve 7

没有必要grep.这是使用的一种方式awk:

仅列出地址:

ifconfig | awk -F "[: ]+" '/inet addr:/ { if ($4 != "127.0.0.1") print $4 }'
Run Code Online (Sandbox Code Playgroud)

列出设备和地址:

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 }'
Run Code Online (Sandbox Code Playgroud)


Mat*_*ark 5

只需使用hostname-I标志,您就可以获取所有IP地址的列表。

$ hostname --all-ip-addresses || hostname -I
10.10.85.100 10.20.85.100 10.30.85.100
Run Code Online (Sandbox Code Playgroud)

$ hostname --ip-address || hostname -i
::1%1 127.0.0.1
Run Code Online (Sandbox Code Playgroud)

Centos7(k3.10.0)