如何在 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 腳本檢測它們在虛擬機中運行