シェルスクリプトから外部IPアドレスを見つける必要があります。現時点では、この関数を使用しています。
myip () {
lwp-request -o text checkip.dyndns.org | awk '{ print $NF }'
}
しかし、それはPerl-libwww
、Perl-html-format
、Perl-html-tree
インストール済み。外部IPを取得するには、他にどのような方法がありますか?
DNSサーバーから直接取得することをお勧めします。
以下の他の回答のほとんどは、HTTPを介してリモートサーバーにアクセスすることです。それらの一部は、出力の解析を必要とするか、サーバーをプレーンテキストで応答させるためにUser-Agentヘッダーに依存していました。それらは頻繁に変更されます(下に移動して、名前を変更し、広告を掲載し、出力形式を変更する場合があります).
Dig
を OpenDNS とともにリゾルバとして使用する:
Dig @resolver1.opendns.com ANY myip.opendns.com +short
おそらくbashrc
にエイリアスを付けると、覚えやすくなります
alias wanip='Dig @resolver1.opendns.com ANY myip.opendns.com +short'
プレーンIPアドレスで応答します。
$ wanip
80.100.192.168 # or, 2606:4700:4700::1111
( https://ss64.com/bash/Dig.html )の略):
usage: Dig [@global-dnsserver] [q-type] <hostname> <d-opt> [q-opt]
q-type one of (A, ANY, AAAA, TXT, MX, ...). Default: A.
d-opt ...
+[no]short (Display nothing except short form of answer)
...
q-opt one of:
-4 (use IPv4 query transport only)
-6 (use IPv6 query transport only)
...
ANY
クエリタイプは、AAAAまたはAレコードを返します。特にIPv4またはIPv6接続を優先するには、それに応じて-4
または-6
オプションを使用します。
応答がIPv4アドレスであることを要求するには、ANYをA
に置き換えます。 IPv6の場合は、AAAA
に置き換えます。接続に使用されるアドレスのみを返すことができることに注意してください。たとえば、IPv6経由で接続する場合、Aアドレスを返すことはできません。
OpenDNSに加えて、AkamaiとGoogleが提供する同様のDNSサービスがあります。
$ Dig @ns1-1.akamaitech.net ANY whoami.akamai.net +short
80.100.192.168
$ Dig @ns1.google.com TXT o-o.myaddr.l.google.com +short
"80.100.192.168"
特にIPv4アドレスを要求するエイリアスの例:
alias wanip4='Dig @resolver1.opendns.com A myip.opendns.com +short -4'
$ wanip4
80.100.192.168
そしてIPv6の場合:
alias wanip6='Dig @resolver1.opendns.com AAAA myip.opendns.com +short -6'
$ wanip6
2606:4700:4700::1111
なんらかの理由でコマンドが機能しない場合は、上流のプロバイダー、コマンドラインツール、またはその他に問題がある可能性があります。機能しない理由を理解するには、+short
オプションなしでコマンドを実行して、DNSクエリの詳細を表示します。例えば:
$ Dig @resolver1.opendns.com ANY myip.opendns.com
;; Got answer: ->>HEADER<<- opcode: QUERY, status: NOERROR
;; QUESTION SECTION:
;myip.opendns.com. IN ANY
;; ANSWER SECTION:
myip.opendns.com. 0 IN AAAA 2606:4700:4700::1111
;; Query time: 4 msec
;; WHEN: Fri Apr 11 00:00:01 GMT 2011
注:これはexternalIPアドレス(インターネット上のサーバーに接続したときに表示されるIPアドレス)についてです-必要な場合内部IPアドレス(自分のコンピュータが接続に使用しているもので、異なる場合があります)を参照してください この答え 。
Dig +short myip.opendns.com @resolver1.opendns.com
または externalip を使用:
externalip dns
curl -s http://whatismyip.akamai.com/
またはexternalipを使用:
externalip http
curl -s https://4.ifcfg.me/
またはexternalipを使用:
externalip https
nc
コマンドで:
nc 4.ifcfg.me 23 | grep IPv4 | cut -d' ' -f4
またはexternalipを使用:
externalip telnet
telnet
コマンドで:
telnet 4.ifcfg.me 2>&1 | grep IPv4 | cut -d' ' -f4
echo close | ftp 4.ifcfg.me | awk '{print $4; exit}'
またはexternalipを使用:
externalip ftp
externalip dns
externalip http
externalip https
externalip telnet
externalip ftp
特にここまたは他の場所に投稿されたHTTP経由で外部IPを提供するさまざまなサーバーのオプションがたくさんあります。
それらのどれかが他のものより優れているかどうかを確認するためにベンチマークを作成し、その結果に驚いた。例えば。最も広く推奨されているifconfig.meの1つはほとんどの場合私にとって最も遅く、時には応答に数秒かかっていました。多くはHTTPSで機能しないか、機能しますが無効な証明書を持っています。応答時間が非常に一貫していないものもあります。
これは私が使用した私のexternalip-benchmarkスクリプトのソースです:
自分で実行して、ここで言及されているどのサービスを使用する価値があるかを確認できます。
wget https://raw.githubusercontent.com/rsp/scripts/master/externalip-benchmark
chmod a+x externalip-benchmark
./externalip-benchmark
2015-04-03にワルシャワから得た私の結果-無実を守るために住所が変更されました:
最高のHTTP応答時間:
0.086s http://ip.tyk.nu/ - answer='172.31.133.7'
0.089s http://whatismyip.akamai.com/ - answer='172.31.133.7'
0.091s http://tnx.nl/ip - answer='172.31.133.7'
0.117s http://ifcfg.me/ - answer='172.31.133.7'
0.156s http://l2.io/ip - answer='172.31.133.7'
0.317s http://ip.appspot.com/ - answer='172.31.133.7'
0.336s http://ident.me/ - answer='172.31.133.7'
0.338s http://ipof.in/txt - answer='172.31.133.7'
0.347s http://icanhazip.com/ - answer='172.31.133.7'
0.496s http://curlmyip.com/ - answer='172.31.133.7'
0.527s http://wgetip.com/ - answer='172.31.133.7'
0.548s http://curlmyip.com/ - answer='172.31.133.7'
0.665s http://bot.whatismyipaddress.com/ - answer='172.31.133.7'
0.665s http://eth0.me/ - answer='172.31.133.7'
1.041s http://ifconfig.me/ - answer='172.31.133.7'
1.049s http://corz.org/ip - answer='172.31.133.7'
1.598s http://ipecho.net/plain - answer='172.31.133.7'
最高のhttps応答時間:
0.028s https://curlmyip.com/ - answer=''
0.028s https://curlmyip.com/ - answer=''
0.029s https://l2.io/ip - answer=''
0.029s https://tnx.nl/ip - answer=''
0.072s https://whatismyip.akamai.com/ - answer=''
0.113s https://ipecho.net/plain - answer=''
0.117s https://ident.me/ - answer=''
0.207s https://ip.tyk.nu/ - answer='172.31.133.7'
0.214s https://ipof.in/txt - answer='172.31.133.7'
0.259s https://ifcfg.me/ - answer='172.31.133.7'
0.289s https://corz.org/ip - answer=''
0.436s https://ip.appspot.com/ - answer='172.31.133.7'
0.448s https://bot.whatismyipaddress.com/ - answer=''
0.454s https://eth0.me/ - answer=''
0.673s https://icanhazip.com/ - answer='172.31.133.7'
5.255s https://ifconfig.me/ - answer=''
10.000s https://wgetip.com/ - answer=''
(注:内容が空の高速応答がいくつかあります-それらは無効です。)
最高の平均ping時間:
10.210 //whatismyip.akamai.com/
36.820 //tnx.nl/ip
37.169 //ip.tyk.nu/
39.412 //ipof.in/txt
40.967 //ident.me/
41.257 //ipecho.net/plain
43.918 //ifcfg.me/
45.720 //l2.io/ip
64.749 //ip.appspot.com/
123.412 //corz.org/ip
134.245 //wgetip.com/
157.997 //icanhazip.com/
161.613 //curlmyip.com/
162.100 //curlmyip.com/
268.734 //ifconfig.me/
999999 //bot.whatismyipaddress.com/
999999 //eth0.me/
ここに私がアムステルダムから2015-04-03に得た結果があります:
最高のHTTP応答時間:
0.021s http://ipecho.net/plain - answer='172.31.13.37'
0.027s http://tnx.nl/ip - answer='172.31.13.37'
0.035s http://whatismyip.akamai.com/ - answer='172.31.13.37'
0.039s http://ifcfg.me/ - answer='172.31.13.37'
0.045s http://l2.io/ip - answer='172.31.13.37'
0.142s http://ident.me/ - answer='172.31.13.37'
0.144s http://ipof.in/txt - answer='172.31.13.37'
0.150s http://ip.appspot.com/ - answer='172.31.13.37'
0.150s http://ip.tyk.nu/ - answer='172.31.13.37'
0.170s http://icanhazip.com/ - answer='172.31.13.37'
0.190s http://eth0.me/ - answer='172.31.13.37'
0.191s http://wgetip.com/ - answer='172.31.13.37'
0.301s http://curlmyip.com/ - answer='172.31.13.37'
0.330s http://bot.whatismyipaddress.com/ - answer='172.31.13.37'
0.343s http://curlmyip.com/ - answer='172.31.13.37'
0.485s http://corz.org/ip - answer='172.31.13.37'
3.549s http://ifconfig.me/ - answer='172.31.13.37'
最高のhttps応答時間:
0.004s https://curlmyip.com/ - answer=''
0.012s https://curlmyip.com/ - answer=''
0.012s https://tnx.nl/ip - answer=''
0.016s https://ipecho.net/plain - answer=''
0.071s https://whatismyip.akamai.com/ - answer=''
0.096s https://ifcfg.me/ - answer='172.31.13.37'
0.097s https://ident.me/ - answer=''
0.187s https://corz.org/ip - answer=''
0.187s https://ip.appspot.com/ - answer='172.31.13.37'
0.189s https://ip.tyk.nu/ - answer='172.31.13.37'
0.195s https://eth0.me/ - answer=''
0.253s https://l2.io/ip - answer=''
0.300s https://ipof.in/txt - answer='172.31.13.37'
0.324s https://bot.whatismyipaddress.com/ - answer=''
0.512s https://icanhazip.com/ - answer='172.31.13.37'
1.272s https://ifconfig.me/ - answer=''
10.002s https://wgetip.com/ - answer=''
最高の平均ping時間:
1.020 //ipecho.net/plain
1.087 //whatismyip.akamai.com/
5.011 //ip.appspot.com/
6.942 //ident.me/
7.017 //ipof.in/txt
8.209 //tnx.nl/ip
11.343 //ip.tyk.nu/
12.647 //ifcfg.me/
13.828 //l2.io/ip
81.642 //icanhazip.com/
85.447 //wgetip.com/
91.473 //corz.org/ip
102.569 //curlmyip.com/
102.627 //curlmyip.com/
247.052 //ifconfig.me/
999999 //bot.whatismyipaddress.com/
999999 //eth0.me/
(999999 pingは、100%のパケット損失を意味します。)
ここで比較のために、他の方法がかかる時間を示します-ワルシャワとアムステルダムから2015-06-16にテストされました。
使用:
time Dig +short myip.opendns.com @resolver1.opendns.com
通常は(実際の壁時計時間)かかります:
このように使用できる実際にはfourリゾルバがあります。
それらはすべてワルシャワとアムステルダムで同じ応答時間を示しますが、これは他の場所ではそうではないかもしれません。
208.67.222.222を使用-ドメイン名の代わりにresolver1.opendns.comのIPの方が高速です:
ただし、IPが変更された場合、将来は機能しない可能性があります(有名なDNSリゾルバーでは考えられない可能性があります-多分私は externalip スクリプトでIPを使用する必要があります-コメントしてください)。
nc
またはtelnet
コマンドを使用したTelnet(上記を参照)は通常、次の処理を実行します。
(nc
コマンドとtelnet
コマンドの間に目立った違いはありません。)
特定のサービスのドメイン名の代わりにIPアドレスが使用される場合(特に初めて実行する場合)、すべての方法がより高速になります(ホストベースの仮想サーバーを使用でき、裸のIPでは機能しないHTTPを除く-テストされていません)が、サービスがIPアドレスを変更すると動作が停止するため、より高速になりますが、将来性が失われます。
お住まいの地域で興味深い結果が表示された場合、または私が選択したホストではなく他のホストを推奨する必要があると思われる場合は、コメントを投稿してください。重要なサービスが不足している場合は、コメントするか、GitHubで 問題を投稿 してください。この投稿を常に最新のベストパフォーマンスサービスで更新したいと思います。
curl -s http://whatismijnip.nl |cut -d " " -f 5
サイトをオランダ語で機能するサイトに置き換えました。
whatsmyip.org および ifconfig.me についてはすでに言及されているため、
curl -s icanhazip.com
Whatismyip.orgの代わりに ifconfig.me を使用できます。
curl -s http://ifconfig.me
また、ifconfig.meにはいくつかの追加機能があります。他にどのような情報を受け取ることができるかについては、ウェブサイトをご覧ください。
Amazon AWS
curl https://checkip.amazonaws.com
出力例:
123.123.123.123
私はそれが好きです:
wget -O - -q http://whatismyip.org/
curl ident.me
OR
curl ifconfig.me
OR
curl tnx.nl/ip
OR
curl ipecho.net/plain
OR
curl ip.appspot.com
OR
curl whatismyip.akamai.com
OR
curl icanhazip.com
OR
curl wgetip.com
OR
curl ip.tyk.nu
OR
curl curlmyip.com
OR
curl corz.org/ip
OR
curl bot.whatismyipaddress.com
私はcurlmyip.comを使用することを好みます。これは次のように簡単です。
curl curlmyip.com
覚えるのは短くて簡単です。
netcat icanhazip.com 80 <<< $'GET / HTTP/1.1\nHost: icanhazip.com\n\n' | tail -n1
これらすべての提案を読んだ後でさらに読みたい場合は、ここに間違いなく過剰に設計されたBashスクリプトを示します。
これには、2017年2月の時点で正常に動作しているように見えるDNSサーバーとHTTPサーバーのリストが含まれています。
Dig
がある場合、最初にDNSを試行します。これは、さまざまなHTTPサービスよりもほぼ1桁高速です。
受け取った最初の応答で終了します。
Dig
がない場合、またはすべてのDNSサーバーに障害が発生した場合は、応答が得られるまでHTTPサービスを試行します。
サーバーはアルファベット順にリストされていますが、常に同じサーバーを使用しないように、使用前にシャッフルされています。
#!/bin/bash
## Get my external IP
timeout=2 # seconds to wait for a reply before trying next server
verbose=1 # prints which server was used to STDERR
dnslist=(
"Dig +short myip.opendns.com @resolver1.opendns.com"
"Dig +short myip.opendns.com @resolver2.opendns.com"
"Dig +short myip.opendns.com @resolver3.opendns.com"
"Dig +short myip.opendns.com @resolver4.opendns.com"
"Dig +short -t txt o-o.myaddr.l.google.com @ns1.google.com"
"Dig +short -4 -t a whoami.akamai.net @ns1-1.akamaitech.net"
"Dig +short whoami.akamai.net @ns1-1.akamaitech.net"
)
httplist=(
4.ifcfg.me
alma.ch/myip.cgi
api.infoip.io/ip
api.ipify.org
bot.whatismyipaddress.com
canhazip.com
checkip.amazonaws.com
eth0.me
icanhazip.com
ident.me
ipecho.net/plain
ipinfo.io/ip
ipof.in/txt
ip.tyk.nu
l2.io/ip
smart-ip.net/myip
tnx.nl/ip
wgetip.com
whatismyip.akamai.com
)
# function to shuffle the global array "array"
shuffle() {
local i tmp size max Rand
size=${#array[*]}
max=$(( 32768 / size * size ))
for ((i=size-1; i>0; i--)); do
while (( (Rand=$RANDOM) >= max )); do :; done
Rand=$(( Rand % (i+1) ))
tmp=${array[i]} array[i]=${array[Rand]} array[Rand]=$tmp
done
}
## if we have Dig and a list of dns methods, try that first
if hash Dig 2>/dev/null && [ ${#dnslist[*]} -gt 0 ]; then
eval array=( \"\${dnslist[@]}\" )
shuffle
for cmd in "${array[@]}"; do
[ "$verbose" == 1 ] && echo Trying: $cmd 1>&2
ip=$(timeout $timeout $cmd)
if [ -n "$ip" ]; then
echo $ip
exit
fi
done
fi
# if we haven't succeeded with DNS, try HTTP
if [ ${#httplist[*]} == 0 ]; then
echo "No hosts in httplist array!" >&2
exit 1
fi
# use curl or wget, depending on which one we find
curl_or_wget=$(if hash curl 2>/dev/null; then echo "curl -s"; Elif hash wget 2>/dev/null; then echo "wget -qO-"; fi);
if [ -z "$curl_or_wget" ]; then
echo "Neither curl nor wget found. Cannot use http method." >&2
exit 1
fi
eval array=( \"\${httplist[@]}\" )
shuffle
for url in "${array[@]}"; do
[ "$verbose" == 1 ] && echo Trying: $curl_or_wget "$url" 1>&2
ip=$(timeout $timeout $curl_or_wget "$url")
if [ -n "$ip" ]; then
echo $ip
exit
fi
done
使用例(スクリプトをmyip
と呼びました):
$ myip
Trying: Dig +short -t txt o-o.myaddr.l.google.com @ns1.google.com
"151.101.65.69"
$ ip=$(myip); echo "IP = '$ip'"
Trying: Dig +short myip.opendns.com @resolver1.opendns.com
IP = '151.101.65.69'
スクリプトの先頭にあるverbose
変数をコメント化して、使用するサーバーの印刷を回避します。
更新:このスクリプトはGithubにもあります。必要に応じて更新します。
https://github.com/mivk/myip
これは常に私にとってはうまくいきます。私は私のconkyでそれを使って私のIPアドレスを取得します。
wget -q -O - checkip.dyndns.org | sed -e 's/[^[:digit:]\|.]//g'
ifcfg.me は以下をサポートします:
curl ifcfg.me
nslookup . ifcfg.me
telnet ifcfg.me
ftp ifcfg.me
finger @ifcfg.me
IPv4およびIPv6、curlでさらに多くのもの: ifcfg.me/?
私は接続やサービスに依存していないので、次のコードを使用して、さまざまなサービスを使用してIPを取得しようとします(さらに追加してください)。
# Get my ip address and put in a file
declare -a arr=("ipecho.net/plain" "ident.me" "tnx.nl/ip" "ip.appspot.com" "https://shtuff.it/myip/short/")
IP=$(curl -s --retry 3 --retry-delay 10 ipecho.net/plain)
while [ -z "$IP" ] # If no IP found yet, keep trying!
do
sleep 30
IP=$(curl -s --retry 3 --retry-delay 10 ${arr[$(( RANDOM % ${#arr[@]} ))]})
done
echo -n "$IP" > /root/clientIP.txt #puts ip address in clientIP.txt
echo "Our address is $IP"
堅牢性を高めるには(サービスの1つが形式を変更した場合など)、$IP
は、次の function を使用した有効なIPです。
# Verify that the parameter passed is an IP Address:
# http://zindilis.com/blog/2013/05/10/bash-check-that-string-is-ip.html
# @Author: Marios Zindilis
# @License: Creative Commons Attribution-ShareAlike 4.0 International License.
# @Date: 2013-05-10
function is_IP() {
if [ `echo $1 | grep -o '\.' | wc -l` -ne 3 ]; then
echo "Parameter '$1' does not look like an IP Address (does not contain 3 dots).";
exit 1;
Elif [ `echo $1 | tr '.' ' ' | wc -w` -ne 4 ]; then
echo "Parameter '$1' does not look like an IP Address (does not contain 4 octets).";
exit 1;
else
for OCTET in `echo $1 | tr '.' ' '`; do
if ! [[ $OCTET =~ ^[0-9]+$ ]]; then
echo "Parameter '$1' does not look like in IP Address (octet '$OCTET' is not numeric).";
exit 1;
Elif [[ $OCTET -lt 0 || $OCTET -gt 255 ]]; then
echo "Parameter '$1' does not look like in IP Address (octet '$OCTET' in not in range 0-255).";
exit 1;
fi
done
fi
return 0;
}
潜在的な落とし穴を回避するためにHTTPSを使用する場合:
_result=$(wget -qO- https://ipcheckit.com/)
_result="${_result##*Your IP address is<br><b>}"
printf '%s\n' "${_result%%</b></p>*}"
ここでは、「パブリックサービス」サイトが廃止されたりフォーマットが変更されたりする可能性があるのではなく、動的IPの管理に関してビジネスが解決するホストに依存する別の代替案を示します。
スクリプトでIPアドレスを取得するには、次のようにします。
external_ip=`Dig +short xxx.no-ip.org`
動的IPが変更され、一部の構成エントリを変更する必要があるかどうかを確認するcronジョブでの使用に最適です。
これにより、ポップアップウィンドウに現在のIPアドレスが表示されます。
zenity --info --text "$(curl -s icanhazip.com)"
私は家族のためにクラウドサービスを実行しています。静的なIPを購入しないので、毎朝5時にcron
で実行するこの簡単なスクリプトを作成しました。
パブリックIPを取得し、ユーザーにメールで送信します。ハイパーリンク形式でメールを送信するようにしたので、私の母はポートなどを入力する必要がありません。多分誰かがそれを使用することができます。
#!/bin/bash
ipvariable=$(wget http://ipecho.net/plain -O - -q);
echo "Today the location is http://$ipvariable:123456/foldertheyreach" | mail -s "From your friendly cloud service provider" [email protected], [email protected]
IPアドレスをJSON/XMLまたはプレーンテキストとして返すサービスを設定しました。あなたはここでそれらを見つけることができます
/ jsonおよび/ xmlと同じURLは他のフォーマットも提供します
HTTPSが必要な場合は、https接頭辞を付けた同じURLを使用できます。利点は、Wi-Fiを使用している場合でもパブリックアドレスを取得できることです。
したがって、単純なエイリアスmyip = "curl https://ipof.in/txt "はIPを取得します
NATルーターがDNSアドレスを変換するルーターの背後でもDNS要求を使用すると、これは機能します。
$ Dig +short -t txt o-o.myaddr.l.google.com @ns1.google.com | cut -d'"' -f2
x.y.z.t
または、代わりにHTTPリクエストメソッドを使用できます。
$ curl -s ipinfo.io/ip
x.y.z.t
Curlを使用してshtuff.itのIPサービスにアクセスする
curl -s https://shtuff.it/myip/short
または、この質問に自動で回答するために発明された [〜#〜] stun [〜#〜] を使用することもでき、インターネット通信などで広く使用されています。 [〜#〜] sip [〜#〜] および WebRTC による。
Stunclientを使用する(debian/ubuntuでapt-get install stuntman-client
)単に次のようにします。
$ stunclient stun.services.mozilla.com
Binding test: success
Local address: A.B.C.D:42541
Mapped address: W.X.Y.Z:42541
どこ A.B.C.D
はローカルネット上のマシンのIPアドレスであり、W.X.Y.Z
は、Webサイトが外部から見ているようなIPアドレスサーバー(および、探しているもの)です。 sed
を使用すると、上記の出力をIPアドレスのみに減らすことができます。
stunclient stun.services.mozilla.com |
sed -ne "s/^Mapped address: \(.*\):.*$/\1/p"
基本的なコマンドラインツールのみを使用した別のSTUNルックアップについては、 AskUbuntuでの私の回答 を参照してください(実稼働での使用ではなく、楽しい演習として意図されています)。
W3m Plaintext-Browserはbashに最適です。 grep
およびtail
を使用して、次のように応答を短縮できます。
w3m -no-cookie -dump "http://www.whatismyip.com/" | grep -A 1 -m 1 "Your IP:" | tail -n 1