[英]Methods to detect public IP address in bash
作為安裝腳本的一部分,我想對機器的公共地址 IP 進行“有根據的猜測”。 它應該盡可能健壯,可以在各種主機和平台上工作。 這是一個例子:
https://gist.github.com/4669037
此腳本使用 3 種方法,然后默認為/etc/hostname
的值。 到目前為止,我只在 Ubuntu 上測試過這個。 這可能適用於其他發行版嗎? 還有我可以添加的其他方法嗎?
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 連接,它就可以工作。
您可以從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
東德:遠程 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.