インストールスクリプトの一部として、マシンpublicIPアドレスについて「教育的な推測」を行いたいと思います。さまざまなホストとプラットフォームで動作し、可能な限り堅牢でなければなりません。以下に例を示します。
https://Gist.github.com/4669037
このスクリプトは3つのメソッドを使用し、デフォルトで/etc/hostname
の値になります。これはこれまでUbuntuでしかテストしていません。これは他のディストリビューションでも機能するでしょうか?また、追加できるメソッドはありますか?
curl ifconfig.me
は、カールがない場合に最適な選択です。
wget -qO- ifconfig.me/ip
どのくらいのパブリックパブリックIPを探していますか?マシンがNATの背後にある場合はどうなりますか?
curl
/wget
/netcat
(nc
)<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を取得した場合に、障害を適切に処理する方法を準備してください。
AWS EC2で次を使用できる場合:
curl checkip.amazonaws.com
注:このサービスは、任意のWebクライアントから使用できます。
このソリューションは、natまたは何かの背後にいる場合は機能しません。サードパーティのサービスなしで役立ちます。マシンにサーバーや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; } )
このコマンドを試してください:
wget -O - -q icanhazip.com
使用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"
Curlを使用してヒット shtuff.it IPサービス
curl http://shtuff.it/myip/short
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クライアントが不要になります。