用于打印 IP 的 Bash 脚本

用于打印 IP 的 Bash 脚本

我需要编写一个 bash 脚本,运行时显示“Your private ip is: XXXX”。我将如何编写这样的脚本?

我也需要做同样的事情,但使用我的公共IP而不是私有IP

任何提示都会有所帮助。谢谢你!

答案1

假设您只对 ipv4 感兴趣:

#!/bin/bash
 
lanIp="$(ip -4 -o -br addr|awk '$0 ~ /^[we]\w+\s+UP\s+/ {str = gsub("/[1-9][0-9]*", "", $0); print $3}')";
wanIp="$(curl https://ipinfo.io/ip 2>/dev/null)";
 
echo "Your private ip is: ${lanIp}";
echo "Your public ip is: ${wanIp}";

解释:

第一个命令使用该ip命令获取本地网络 ipv4 地址,然后将输出通过管道传输到,以便awk从输出中仅提取 ipv4 地址。

但是,ip会为每个存在的网络接口显示一行,并且每行上的信息不仅仅是 IP 地址。因此,我们需要过滤掉不活动的接口,然后只保留 IP 地址。如果需要,您可以使用grep和来执行这些步骤,甚至可以使用, 但我在这里使用了。sedperlawk

awk用于$0将第一个命令的整个输出行与正则表达式匹配,^[we]\w+确保该行包含以“e”或“w”开头的名称(Linux 中的 wifi 和以太网网络接口通常以这种方式开头)。这部分可能不完全可移植,但它在几个 Linux 发行版以及 Termux 上对我来说都有效。不过我还没有在 Mac 或 BSD 上测试过它。它还确保接口名称后面有文本“UP”,以仅匹配活动的网络接口。然后,它使用 的awk函数gsub从结果中仅提取 IP 地址,然后将其打印回设置为变量的标准输出lanIp

eth0如果您有一个静态命名的网络接口,或者您可以在脚本中硬编码接口名称,那么这可能会被简化。我使用上述内容是因为大多数现代 Linux 发行版使用半随机生成的接口名称,并且这适用于 wifi 或以太网接口。

第二个命令使用curl从网站获取WAN地址,该网站只返回您的WAN IP并将其他输出从curl重定向到/dev/null.

相关内容