如何在 Linux Bash 脚本中获取您的公共 IP

已发表: 2022-11-12
蓝色背景上的笔记本电脑,显示 Linux 命令提示符。
fatmawati achmad zaenuri/Shutterstock.com
您可以使用 curl 命令(如“curl -s ifconfig.me”)从网站获取外部 IP。 但是,网站可以更改。 要获得更可靠的答案,请使用 dig 命令,例如“dig @resolver1.opendns.com myip.opendns.com +short”从 DNS 服务器获取您的 IP。

如果您想远程连接到您的计算机,则需要您的外部 IP 地址。 手动查找它很容易,但这里是从 Linux 脚本中查找它的方法。

内部和外部 IP 地址

Internet 协议地址用于识别网络上的设备。 它们是网络上的唯一标签,分配给单个设备。 如果另一台设备想要向该设备发送数据,它可以使用其 IP 地址来完成。

IP 地址如何工作?
相关IP 地址如何工作?

您的宽带调制解调器内置了一个网络路由器,可将网络中的网络流量从一个设备引导到另一个设备。 当设备加入网络时,它也是为设备分配 IP 地址的地方当局。 它还维护一个网络名称和 IP 地址表。 这允许您为网络上的计算机赋予有意义的名称,因为对于人类来说,名称比数字列表更容易使用。

互联网上的设备也有一个 IP 地址。 其中一些也有名称,例如网站。 域名服务提供商会自动查找网站域名并将其换成 IP 地址。

您的宽带调制解调器由您的互联网服务提供商 (ISP) 提供其自己的面向互联网或外部IP 地址。 无论您家中连接到互联网的设备数量如何,它们的组合流量都通过该单个 IP 地址流出。

如果您不在城里,并且想要连接到您家中的一台计算机上运行的服务,则需要使用您的外部 IP 地址来执行此操作。 当然,您的路由器需要设置为将您的连接请求路由到您家中的相应设备。

除非您每月向 ISP 支付一点额外费用以获得静态IP 地址,否则您的外部 IP 地址可能会不时更改。 重新启动宽带调制解调器很可能会导致您获得不同的外部 IP 地址。 因此,如果您需要知道您的外部 IP 地址,您不能只检查一次并存储它。 您需要定期确定它是什么。

查找您的外部 IP 地址

发现您的外部 IP 地址意味着与您的网络之外的事物交谈。 换句话说,访问互联网上可以为我们提供所需信息的东西。 我们需要凝视虚空,看看是什么在回望我们。 然后向它询问我们的外部地址。

我们有两种方法可以做到这一点。 一种方式涉及网站。 有很多网站会告诉你你的外部 IP 地址是什么,还有很多其他信息。 您可以在浏览器中访问这些内容,或使用curl等可以发出 HTTPS 请求的命令行工具。

另一种方法是使用专用命令,例如digdig命令询问 DNS 服务器以检索信息。

使用浏览器

当然,使用浏览器获取外部 IP 地址并不是一种脚本友好的方式。 但是查看提供该服务的网站可以为我们提供有用的信息。 我们曾经推荐过 ip4.me,但该站点尚未更新为 HTTPS。 它仍然使用旧的、不安全的 HTTP。 该网站仍然有效,但现在有更好的选择。

ifconfig.me 站点提供了一组很好的信息。

显示外部 IP 地址的 ifconfig.me 网站

这将我们的外部 IP 报告为 178.238.11.140。 向下滚动网页,您将找到可用于从站点检索信息的命令列表。

显示一系列 cURL 命令的 ifconfig.me 网站

他们给出的示例都使用curl来询问站点。 那么让我们来看看使用curl

使用卷曲

在我们的测试机器上,Fedora 37 已经安装了curl 。 我们需要将它安装在我们的 Ubuntu 和 Manjaro 计算机上。

要在 Ubuntu 上安装它,请输入:

 sudo apt install curl 

在 Ubuntu 上安装 curl

Manjaro 上的命令是:

 sudo pacman -S curl 

在 Manjaro 上安装 curl

我们可以使用ifconfig.me网页上列出的第一个命令来试试这个。

 卷曲 ifconfig.me 

使用 ifconfig.me 网站的默认操作获取外部 IP 地址

我们的外部 IP 地址被检索并显示在终端窗口中。 输出是准系统。 字符串之后甚至没有打印换行符。 命令提示符与 IP 地址直接对接。

如何使用 curl 从 Linux 命令行下载文件
相关如何使用 curl 从 Linux 命令行下载文件

此命令有效,因为返回 IP 地址是网站的默认操作。 如果默认操作发生变化,我们可能会得到不同的结果返回给我们。 为了解决这个问题,我们可以通过将“ip”标识符添加到 URL 来指定我们正在请求我们的 IP 地址。

 卷曲 ifconfig.me/ip 

使用带有 ip specfier 的 ifconfig.me 网站获取外部 IP 地址

这会像以前一样返回 IP 地址。

这说明了使用网站作为 IP 地址来源的问题。 网站可能会关闭,也可能会改变其运作方式或返回信息的格式。 这些更改将使依赖于这些站点的脚本失败或行为不可预测。

使用信誉良好且可靠的资源(如 DNS 服务器)是获取外部 IP 的更可靠方法。 要查询 DNS 服务器,我们需要使用 dig 命令。

相关:什么是 DNS,我应该使用另一个 DNS 服务器吗?

使用 dig 命令

这一次, dig安装在 Fedora 和 Ubuntu 上,我们只需要安装在 Manjaro 上。

该命令是通常的pacman命令,所以这并不奇怪,但包名称不是您所期望的。

 sudo pacman -S 绑定工具

在 Manjaro 上安装 dig

要使用dig发现我们的外部 IP 地址,我们需要将其指向 DNS 服务器。 我们使用的是 Cisco 提供的 OpenDNS 服务器。

我们需要指定要使用的 DNS 服务器的名称,前面有一个 at 符号“@”。 我们还需要命名我们希望检索的记录类型。 在这种情况下,它是“myip”。 +short选项确保我们得到简洁的响应,而不是冗长的响应。

 挖掘@resolver1.opendns.com myip.opendns.com +short 

使用 dig 命令从 DNS 服务器检索外部 IP 地址

这一次,我们的 IP 地址后面打印了一个换行符。 正如我们将看到的,这是在 IP 地址字符串之后打印的,它不是字符串本身的组成部分。

相关:如何在 Linux 上使用 dig 命令

在脚本中使用这些

您可能想从脚本中了解外部 IP 地址的原因有很多。 也许您有一个脚本来监控您的外部 IP 地址是否已更改,并在发生更改时通知您。 或者,服务器可能会在其地址更改时通知其客户端。 无论您出于何种原因,我们都可以很容易地在脚本中实现我们在命令行中使用的命令。

要检索我们的外部 IP 地址并将其分配给变量,我们只需将命令包装在命令替换$(...)中,并将其分配给变量,如下所示:

 变量=$(...)

括号内的命令被执行,返回值被替换为表达式。 在本例中,命令被简化为“variable=return value”。

相关:如何在 Bash 中使用变量

这是一个脚本。 我们在curl命令中添加了-s (静默)选项,以防止它报告数据检索的进度。

 #!/bin/bash

extaddr=$(curl -s ifconfig.me)

echo "外部 IP 地址是 $extaddr (来自 cURL)"

将此脚本复制到编辑器,并将其保存为“getex1.sh”,并使用chmod命令使其可执行。

 chmod +x getex1.sh 

使用 chmod 使脚本可执行

让我们执行脚本,看看我们得到了什么。

 ./getex1.sh 

运行 getex1.sh 脚本

要使用更强大的 DNS 服务器而不是网站选项来做同样的事情,我们需要做的就是用dig命令替换curl命令。

 #!/bin/bash

extaddr=$(dig @resolver1.opendns.com myip.opendns.com +short)

echo "外部 IP 地址是 $extaddr (from dig)"

将此保存为脚本“getex2.sh”并使用chmod使其可执行。

 chmod +x getex2.sh 

使用 chmod 使脚本可执行

让我们执行这个脚本。

 ./getex2.sh 

运行 getex2.sh 脚本

我们可以从两个脚本的输出中看到,尽管命令dig在命令行上打印了一个换行符,但在脚本中没有向extaddr变量添加换行符。

追求可靠性

使用信誉良好且输出格式可预测的公认服务总是比使用“非官方”网站更安全。 像互联网上的其他一切一样,好好看看你从谁那里得到你的信息。

相关:如何让 Linux 脚本检测它们在虚拟机中运行