web-dev-qa-db-ja.com

bashでパブリックIPアドレスを検出する方法

インストールスクリプトの一部として、マシンpublicIPアドレスについて「教育的な推測」を行いたいと思います。さまざまなホストとプラットフォームで動作し、可能な限り堅牢でなければなりません。以下に例を示します。

https://Gist.github.com/4669037

このスクリプトは3つのメソッドを使用し、デフォルトで/etc/hostnameの値になります。これはこれまでUbuntuでしかテストしていません。これは他のディストリビューションでも機能するでしょうか?また、追加できるメソッドはありますか?

26
Jeroen
curl ipinfo.io/ip

または

wget -qO- ipinfo.io/ip

または

lynx -source ipinfo.io/ip

パブリックIPアドレスの取得

47
Steven Penny

curl ifconfig.meは、カールがない場合に最適な選択です。

wget -qO- ifconfig.me/ip

10
Kent

どのくらいのパブリックパブリックIPを探していますか?マシンがNATの背後にある場合はどうなりますか?

  • curl/wget/netcatnc<URL>これにはリクエスタのアドレスが含まれます。ほとんどの場合は機能しますが、サイトがマシンから到達できない可能性があります(ファイアウォールまたは一時的/永続的な利用不可)。できる限り多くのパブリックIPを取得します。

  • ifconfig:rootとして実行する必要があります。そうでなければ、/sbin/ifconfigまたは/usr/sbin/ifconfig 同様に。マシンにさらにNICがある場合はどうなりますか?どのIPが正しいIPであるかをどのように確認しますか?マシンのLANでIPv6のみが使用されている場合はどうなりますか?いずれにせよ、できる限り少ないパブリックIPを取得します(マシンにさらにインターフェイスが構成されている場合は、おそらく間違ったIPになります-最近では、ネットワークタップデバイスを使用した遍在する仮想化の場合などです)。

  • /etc/hostname:存在する必要はありません。多くのシステムでは/etc/HOSTNAME、およびIPアドレスは含まれず、ホスト名(通常はFQDN)が含まれる必要があります。

ポイントは、失敗する可能性のある方法は多数あり、おそらくa)ターゲットとするシステムをより正確に指定するか、b)IPを本当に知る必要があるかどうかを検討する必要があることです-これは、少し複雑な設定で惨めに失敗したときに使用する価値のある単純なケースで動作しますか? IPが必要だと思う場合は、IPをまったく取得できないか、間違ったIPを取得した場合に、障害を適切に処理する方法を準備してください。

3
peterph

AWS EC2で次を使用できる場合:

curl checkip.amazonaws.com

注:このサービスは、任意のWebクライアントから使用できます。

1
Eric Semwenda

このソリューションは、natまたは何かの背後にいる場合は機能しません。サードパーティのサービスなしで役立ちます。マシンにサーバーやppp接続などの接続があれば機能します。

  • 質問に対する正確な正解ではありませんが、おそらく他の人(私のような)に役立ちます
  • ほとんどの場合、rootである必要があります(またはall?)の場合

(最初の)デフォルトルートを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; } )
1
Furkan Mustafa

このコマンドを試してください:

wget -O - -q icanhazip.com
1
MCurbelo

使用ipifyAPI:

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

Bashスクリプト:

#!/bin/bash

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

Curlを使用してヒット shtuff.it IPサービス

curl http://shtuff.it/myip/short
0
Chris Montanaro

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クライアントが不要になります。

0
Jasen