簡體   English   中英

bash中公網IP地址檢測方法

[英]Methods to detect public IP address in bash

作為安裝腳本的一部分,我想對機器的公共地址 IP 進行“有根據的猜測”。 它應該盡可能健壯,可以在各種主機和平台上工作。 這是一個例子:

https://gist.github.com/4669037

此腳本使用 3 種方法,然后默認為/etc/hostname的值。 到目前為止,我只在 Ubuntu 上測試過這個。 這可能適用於其他發行版嗎? 還有我可以添加的其他方法嗎?

curl ipinfo.io/ip

要么

wget -q -O - ipinfo.io/ip

要么

lynx -source ipinfo.io/ip

獲取公共IP地址

curl ifconfig.me將是最佳選擇,以防您沒有 curl:

wget -qO- ifconfig.me/ip

您要尋找多少公共公共 IP? 如果機器在 NAT 后面怎么辦?

  • curl / wget / netcat ( nc ) <URL>包含請求者的地址:應該在大部分時間都可以工作,但該站點可能無法從機器訪問(無論是防火牆還是臨時/永久不可用)。 您將獲得盡可能多的公共 IP。

  • ifconfig :必須以 root 身份運行,否則您還必須嘗試/sbin/ifconfig/usr/sbin/ifconfig 如果機器有更多的網卡怎么辦? 你如何判斷哪個IP是正確的? 如果機器的 LAN 上只使用 IPv6 會怎樣? 在任何情況下,您都將獲得盡可能少的公共 IP(如果在機器上配置了更多接口,則可能是錯誤的 IP——如今使用網絡分流設備和/或無所不在的虛擬化通常就是這種情況)。

  • /etc/hostname :不需要存在,在許多系統上它是/etc/HOSTNAME ,它不包含 IP 地址,而應該包含主機名(通常是 FQDN)。

關鍵是,它可能失敗的方式有很多,您可能應該考慮 a) 更准確地指定您的目標系統或 b) 您是否真的需要知道 IP - 似乎是一個解決方案在簡單的情況下工作,當它在稍微復雜的設置中慘遭失敗時值得使用嗎? 如果您認為您需要 IP,請准備一種方法來優雅地處理故障,以防您根本沒有獲得 IP 或獲得錯誤的 IP。

試試這個命令:

wget -O - -q icanhazip.com

如果在 AWS EC2 上,您可以使用:

curl checkip.amazonaws.com

注意:此服務可從任何 Web 客戶端使用。

我在這里找到了我個人喜歡的方法:

  • dig +short myip.opendns.com @resolver1.opendns.com
  • dig +short txt ch whoami.cloudflare @1.0.0.1
  • dig +short txt oo.myaddr.l.google.com @ns1.google.com
    • dig +short txt oo.myaddr.l.google.com @ns1.google.com | awk -F'"' '{print $2}'

如果您落后於 nat 或其他東西,則此解決方案不起作用。 它在沒有 3rd 方服務的情況下有所幫助。 如果機器上有連接,如服務器或 ppp 連接,它就可以工作。

  • 不是一個完全正確的問題答案,但可能會幫助其他人(比如我)
  • 在大多數(或所有?)情況下需要 root

您可以從route -n獲取(第一個)默認路由,找到它使用的接口,並找到它擁有的 ip。

MAINIF=$( route -n | grep '^0\.0\.0\.0' | head -n 1 | awk '{print $NF}' )
IP=$( ifconfig $MAINIF | { IFS=' :';read r;read r r a r;echo $a; } )

僅使用 bash(在icanhazip.com 的幫助):

exec 3<>/dev/tcp/icanhazip.com/80 
echo -e 'GET / HTTP/1.0\r\nhost: icanhazip.com\r\n\r' >&3 
while read i
do
 [ "$i" ] && myip="$i" 
done <&3 
echo "$myip"

bash 打開一個到 icanhazip 的套接字並發送一個 http 請求,IP 地址在返回數據的最后一個非空行上返回。 (前幾行是 http 標頭)

這避免了像 wget 或 curl 這樣的 http 客戶端的需要。

使用 curl 打shtuff.it IP 服務

curl http://shtuff.it/myip/short

使用ipify API:

curl 'https://api.ipify.org?format=json'

bash腳本:

#!/bin/bash

ip=$(curl -s https://api.ipify.org)
echo "My public IP address is: $ip"

我使用 IPGrab 是因為它很容易讓我記住。

curl http://ipgrab.io

我在其他命令的末尾得到空格字符:

$ curl -s https://api.ipify.org
255.255.255.255%

我發現使用 jsonip.com 結合jq擺脫了這個。 這樣,解析 IP 地址就像 jq 表達式一樣簡單:

$ curl -s https://jsonip.com | jq -r '.ip'
255.255.255.255

看到這個jq 播放

東德:遠程 es un host al que tengas acceso y home es un host del que quieres averiguar su ip

腳本重擊:

 #!/bin/bash

 host_remote="sirio.fun"
 host_home="tutia.ovh"
      
 ip_home=$(ssh $host_remote ping -c 1 $host_home | awk '/bytes from/ {print $4}')
        
 echo $ip_home

節拍:

#!/bin/bash

function alert() {
    echo "Old ip: "$ip_home_save
    echo "New ip: "$ip_home
    
    echo "Se guarda la nueva ip"
    ssh $host_remote ping -c 1 $host_home | awk '/bytes from/ {print $4}' > $host_remote_file
}

host_remote="sirio.fun"
host_home="cacadela.vaca"

host_remote_file=/tmp/${host_remote}.tmp

ip_home=$(ssh $host_remote ping -c 1 $host_home | awk '/bytes from/ {print $4}')

if [[ -f $host_remote_file ]]; then
    ip_home_save=$(cat $host_remote_file)
    echo $ip_home
    echo $ip_home_save
    [[ $ip_home == $ip_home_save ]] || error=1
else
    echo "No existen datos para comprobar, se generan ahora para futuras referencias"
    ssh $host_remote ping -c 1 $host_home | awk '/bytes from/ {print $4}' > $host_remote_file
    exit 1
fi

[[ $error ]] && alert || echo "No problem"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM