我需要编写一个 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
和来执行这些步骤,甚至可以使用, 但我在这里使用了。sed
perl
awk
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
.