シェルスクリプトで外部IPアドレスを取得するにはどうすればよいですか?


273

シェルスクリプトから外部IPアドレスを見つける必要があります。現時点では、この関数を使用しています。

myip () { 
    lwp-request -o text checkip.dyndns.org | awk '{ print $NF }'
}

しかし、それが依存perl-libwwwperl-html-formatperl-html-treeインストールされています。外部IPを取得できる他の方法は何ですか?


8
外部IPとはどういう意味ですか?これまでの2つの答えはHTTPを使用しています。応答は、ISPのプロキシサーバーのIPになる場合があります。(あなたが望むものかもしれません。)
billpg

@billpg:NATルーターのIP
Eugene Yarmash

次に、HTTPSを使用するwhat-is-my-IP Webサービスが必要になります。悲しいかな、私は何も知りません。
-billpg

1
@billpg ipcheckit.com-
ジル

checkip.amazonaws.comはよく知られているプロバイダー
-arulraj.net

回答:


442

DNSサーバーから直接取得することをお勧めします。

以下の他の回答のほとんどは、HTTPを介してリモートサーバーにアクセスすることに関するものです。それらのいくつかは、出力の解析を必要とするか、User-Agentヘッダーに依存してサーバーをプレーンテキストで応答させました。これらは頻繁に変更されます(下に行く、名前を変更する、広告を表示する、出力形式を変更するなど)。

  1. DNS応答プロトコルは標準化されています(形式の互換性は維持されます)。
  2. 歴史的に、DNSサービス(OpenDNSGoogle Public DNSなど)は、今日流行している新しいヒップなwhatismyip.com HTTPサービスよりもはるかに長く存続する傾向があり、より安定し、スケーラブルであり、一般的に見栄えがよくなります。
  3. この方法は本質的に高速です(数ミリ秒だけです!)。

リゾルバとしてOpenDNSを使用digする:

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またはレコードのいずれかを返します。特に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

18
あなたは正しいです、それは速すぎます..
ラフルパティル

4
@Krinkleそれは素晴らしい答えです。myip.opendns.comGoogleのパブリックDNSに相当するものはありますか?
Kannanモハン14年

12
これは〜よりも19倍高速であることがわかりましたcurl http://canhazip.com。参照してくださいaskubuntu.com/a/427092/2273
アダムMonsen

3
ポート80にバインドされていない限り、このクリーンな/依存関係のないアプローチが他のすべての提案よりもはるかに優れています
-binaryanomaly

5
場合によっては、NATを提供するルーターがDNS応答も変換することに注意してください(wiki.nil.com/Network_address_translation_of_DNS_responsesをご覧ください)。この場合、DNS以外のアプローチを推奨する回答にフォールバックする必要があります。
ラズバンステファネスク

146

注:これはについてです外部 IPアドレス(あなたがそれらに接続したときに、インターネット上のサーバーが参照1) -あなたがしたい場合は、内部(異なる可能性が自分のコンピュータが接続を使用している1)IPアドレスを参照してください、これを答えます。

TL; DR-2015年の最速の方法

DNSを使用した最速の方法:

dig +short myip.opendns.com @resolver1.opendns.com

またはexternalipを使用:

externalip dns

HTTPを使用した最速:

curl -s http://whatismyip.akamai.com/

またはexternalipを使用:

externalip http

有効な証明書でHTTPSを使用して最速:

curl -s https://4.ifcfg.me/

またはexternalipを使用:

externalip https

telnetを使用:

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

FTPを使用する:

echo close | ftp 4.ifcfg.me | awk '{print $4; exit}'

またはexternalipを使用:

externalip ftp

上記のすべては、externalipスクリプトを次のように使用して実行できます。

externalip dns
externalip http
externalip https
externalip telnet
externalip ftp

長い話...

特にここまたは他の場所に掲載されているHTTPを介して外部IPを提供するさまざまなサーバーのオプションが多数あります。

それらのどれかが他のものより優れているかどうかを確認するためのベンチマークを作成し、その結果に驚きました。たとえば、最も広く推奨されているifconfig.meの1つはほとんどの場合最も遅く、応答に数秒かかることもあります。多くはHTTPSで動作しないか、動作しますが無効な証明書を持っています。応答時間が非常に一貫していないものもあります。

ベンチマーク

HTTPおよび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%のパケット損失を意味します。)

DNS

ここで比較するために、他の方法がかかる時間を示します-2015-06-16にワルシャワとアムステルダムでテストされました。

を使用して:

time dig +short myip.opendns.com @resolver1.opendns.com

通常、次のことを行います(実際の壁時計時間):

  • ワルシャワから0.035秒
  • アムステルダムから0.015秒

この方法で使用できるリゾルバは実際には4つあります。

  • resolver1.opendns.com
  • resolver2.opendns.com
  • resolver3.opendns.com
  • resolver4.opendns.com

それらはすべてワルシャワとアムステルダムで同じ応答時間を提供しますが、他の場所ではそうではないかもしれません。

208.67.222.222を使用する-ドメイン名の代わりにresolver1.opendns.comのIPの方が高速です。

  • ワルシャワから0.023秒
  • アムステルダムから0.009秒

ただし、IPが変更された場合、将来的には機能しない可能性があります(よく知られているDNSリゾルバーでは考えられない可能性があります。おそらく、externalipスクリプトでIPを使用する必要があります-コメントしてください)。

Telnet

ncor telnetコマンドを使用したTelnet (上記を参照)の通常の動作:

  • ワルシャワから0.103秒
  • アムステルダムから0.035秒

nctelnetコマンドの間に顕著な違いはありません。)

FTP

  • ワルシャワから0.104秒
  • アムステルダムから0.036秒

ドメイン名

特定のサービスのドメイン名の代わりにIPアドレスを使用すると、すべての方法が高速になります(特に初めて実行する場合)(ホストベースの仮想サーバーを使用でき、ベアIPで動作しないHTTPを除く)-テストされていません)が、サービスがIPアドレスを変更すると動作が停止するため、高速になりますが、将来性は低くなります。

コメント

自分の場所から興味深い結果が表示された場合、または私が選択したホストではなく他のホストを推奨する必要があると思われる場合は、コメントを投稿してください。重要なサービスが欠落している場合は、GitHubに問題をコメントするか投稿してください。この投稿を、現在選択されている最高のパフォーマンスのサービスで更新したいと思います。


2
Krinkleの答えのmyip.opendns.comように、DNSメソッドをベンチマークしましたか?現在、このメソッドの他のプロバイダーを認識していないため、デフォルトで勝者になっているようですが、他のメソッドと比較することは依然として有用です。
ジェームスヘイ

@JamesHaigh提案をありがとう。DNSおよびその他の方法(telnet、ftp)を回答に追加しました。最速の方法は、リゾルバの(ドメイン名の代わりに)IPアドレスを直接使用するDNSのようです。
rsp

canhazip.com / canhazip.comも追加/テストする必要があります(HTTPおよびHTTPS)。
xxdesmus

リストにmyip.addr.spaceを追加できます。当時見た他のどれにも特に満足していないので、私は自分でこれを作りました。
マイケルハンプトン

時々dig +short myip.opendns.com @resolver1.opendns.comdig -4 @ns1-1.akamaitech.net -t a whoami.akamai.net +short(36.86.63.180)、(118.98.115.34)、およびcurl http://canhazip.com(36.71.64.71)を使用して異なる結果が得られます。どちらが正しいかをどのように判断できますか?
スタンディノ

80
 curl -s http://whatismijnip.nl |cut -d " " -f 5

サイトをオランダの機能するものに置き換えました。


3
+1 whatismyip.comについては知っていましたが、whatismyip.orgについては知りませんでした。
ジュリアン

そのことを知らなかった!素晴らしいサイト!
bbosak

2
@MaciekSawicki -sこの場合、オプションは本当に必要ですか?私はフェドラ15-bash 4.2.10(1)でそれを使用して/使用せずに試しましたが、両方の方法で機能しました。
ztank1013

4
CLIを介してもう機能しないようですが、WebブラウザからWebページにアクセスしても機能します。私はopenSUSE 12.1 x64を使用しています。
SaultDon

5
whatismyip.com外部IPをチェックする無料サービスを削除しました。だから、これはもう正しくないのではないかと思う。icanhazip.comまだ動作します。
daSong

54

以来whatsmyip.orgifconfig.meは、すでに言及されています。

curl -s icanhazip.com

4
もう1つ:ip.appspot.comまたはip.appspot.com
Lekensteyn

1
これら2つはIPv6をサポートします。
ジョシュ・リー

1
@ JoshLee、icanhazipはipv6もサポートしていることに注意してください。また、OPへの注意事項として、これらのcurlソリューションはすべて(有効ではありますが)外部ライブラリに依存しています(libcurl)。
HalosGhost 14

もう1つ:ifcfg.me
Eun

18

whatismyip.orgの代わりにifconfig.meを使用できます。

curl -s http://ifconfig.me

また、ifconfig.meにはいくつかの追加機能があります。あなたが受け取ることができる他の情報を見つけるには、ウェブサイトにアクセスしてください。


5
それは非常に遅いです。応答時間は30秒以上、場合によっては1分以上かかることがよくあります!場合によっては0.5秒(それでも多くの場合)であり、その後15秒程度です。これはさまざまな場所でテストされています。詳細とベンチマーク
-rsp

15
wget -O - -q http://whatismyip.org/

3
:私はちょうどとしてそれを与え、このように私のIPを取得することができませんでした<img src='ipimg.php'/>
Yuugian

いくつかの正規表現の魔法で動作するようになりましたが、簡単ではありませんでした。このサービスの使用を主張する場合は、必ずその行をスクリプトにラップして$ curl -s http://whatismyip.org | grep -o '\([[:digit:]]\{1,3\}\.\)\{3\}[[:digit:]]\{1,3\}'
ください。–構文エラー

13

Amazon AWS

curl https://checkip.amazonaws.com

サンプル出力:

123.123.123.123

私はそれが好きです:

  • プレーンテキストIPのみを返し、それ以外は何も返しません
  • すぐにオフラインになることはほとんどない有名なプロバイダーからのものです

9

curlmyip.comを使用することを好みます。

curl curlmyip.com

短くて覚えやすいです。


bashOPの意図」で使用する-s場合、他の回答に記載されているオプションなしでは実行できません。
セルジュStroobandt 14

3
@SergeStroobandtはい、できます。すべての-sスイッチは、すなわち、サイレントモードで実行されません。エラーメッセージは表示されません。したがって、スクリプトでエラーを処理する方法が決まります。コマンド自体はを使用するのと同じくらい確実にIPアドレスを返します-s
ギャレットフォガリー14

1
これまでのところ、このサイトは複数のテストで最も信頼できるサイトでした。
アモスシャピラ14

9
curl ident.me

または

curl ifconfig.me

または

curl tnx.nl/ip

または

curl ipecho.net/plain

または

curl ip.appspot.com

または

curl whatismyip.akamai.com

または

curl icanhazip.com

または

curl wgetip.com

または

curl ip.tyk.nu

または

curl curlmyip.com

または

curl corz.org/ip

または

curl bot.whatismyipaddress.com

参照


6
netcat icanhazip.com 80 <<< $'GET / HTTP/1.1\nHost: icanhazip.com\n\n' | tail -n1

ここは空の出力ですが、サイトは機能しています。理由は何ですか?それが関連する場合、私はプロキシの背後にいますが、wget icanhazip.com動作します。
l0b0

@を省略するようにしてくださいl0b0 | tail -n1一部を、あなたがプロキシから得るものを参照してください
ユージンYarmash

何もせずに、単にコード1を終了しますnetcat icanhazip.com 80$http_proxyプロキシとポートを指定する-xだけでプロセスがハングするため、無視して友人のように見えます。
l0b0

@ l0b0:netcat proxy 3128 <<<$'GET http://icanhazip.com/ HTTP/1.0\n\n' | tail -n 1基本的なHTTPプロキシの場合(ポート3128で実行されていると仮定)。ただし、明らかにプロキシのIPアドレスを取得します。
トリプリー

1
HTTP 1.0にはHost:リクエストヘッダーがありません。名前ベースの仮想ホスティングは、HTTP 1.1の主要な改良点の1つです。要求を変更してHTTP / 1.1を指定するか、Hostヘッダーを削除します(前者をお勧めします)。
CVn

4

これらのすべての提案を読んだ後、さらに読みたい場合は、間違いなく過剰に設計されたBashスクリプトがあります。

2017年2月の時点で正常に機能しているように見えるDNSおよびHTTPサーバーのリストが含まれています。

持っている場合dig、最初にさまざまなHTTPサービスよりもほぼ1桁速いDNSを最初に試行します。

取得した最初の応答で終了します。

持っていない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


3

潜在的な落とし穴を避けるためにHTTPSを使用する場合:

_result=$(wget -qO- https://ipcheckit.com/)
_result="${_result##*Your IP address is<br><b>}"
printf '%s\n' "${_result%%</b></p>*}"

2
おそらく、ここで避けている潜在的な落とし穴について詳しく説明できますか?
カレブ

ドメインipcheckit.comは明らかに販売されており、サービスを表示するIPアドレスをホストしていません。
マナトワーク

ああ、:)書き込み専用スクリプトの落とし穴
ЯрославРахматуллин

@Chris Downの手法はまだ有効です。使用するには、別のSSL対応サイトが必要です。
カレブ

3

ここに、消え去るかフォーマットを変更するかもしれない「公共サービス」サイトではなく、動的IPの管理に関してビジネスが解決するホストに依存する別の選択肢があります。

  1. 多くの無料の動的DNSサービス(no-ip.comなど)の1つでサーバーを登録します。これにより、xxx.no-ip.orgのようなDNSエントリが得られます。
  2. サービスの動的更新ツールをインストールします(IPの変更をサービスに報告します)。

スクリプトでIPアドレスを取得するには、次のようにします。

external_ip=`dig +short xxx.no-ip.org`

ダイナミックIPが変更され、いくつかの構成エントリを変更する必要があるかどうかを確認するために、cronジョブで使用するのに最適です。


3

これは常に機能します。IPアドレスを取得するためにconkyで使用します。

wget -q -O - checkip.dyndns.org | sed -e 's/[^[:digit:]\|.]//g'

+1とても不器用に見えますが、このアプローチは私にとっても数回の命の恩人です。ので、インターネットはWWWではありません。インターネットにアクセスできますが、(通常はサーバールームで)非GUIコンソールの運命にある可能性があります。この場合、checkIPサービスURLの1つをに留めておくことが重要です。これは非常に一般的なものであるため、DynDNSを覚えている可能性が高いため、コンパイルされているように見えますamazonaws。つまり、Googleで検索する方法がない場合です。(偶数でもないlynx)。
構文エラー

3

接続やサービスに依存していないため、次のコードを使用します。このコードは、さまざまなサービスを使用して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次の関数を使用して有効な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;
}

3

ifcfg.me以下をサポートします:

curl ifcfg.me
nslookup . ifcfg.me
telnet ifcfg.me
ftp ifcfg.me
finger @ifcfg.me

IPv4およびIPv6、curlを使用した場合:ifcfg.me/?


この方法は、Krinkleの答えの方法とどのようにnslookup関連していますか?どちらもDNSを使用していますよね?ここで実行しているのと同じDNSレコードを取得するオプションを渡すことはできますか?digdignslookup
ジェームスヘイ

うん、あなたは使用することができdig +short . @ifcfg.me、あなたが望むなら
ウン

2

私は家族のためにクラウドサービスを実行しcron、静的IPを購入しないので安いので、毎朝5時に実行するこの簡単なスクリプトを作成しました。

パブリック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" user1@someemail.com, user2@ect.com

1

これにより、ポップアップウィンドウに現在のIPアドレスが表示されます。

zenity --info --text "$(curl -s icanhazip.com)"

1

JSON / XMLまたはプレーンテキストとしてIPアドレスを返すサービスをセットアップしました。ここで見つけることができます

http://ipof.in/txt

/ jsonと/ xmlを使用した同じURLは、他の形式も提供します

HTTPSが必要な場合は、httpsプレフィックス付きの同じURLを使用できます。利点は、Wifiを使用している場合でも、パブリックアドレスを取得できることです。

したがって、単純なエイリアスmyip = "curl https://ipof.in/txt "はIPを取得します


1

別の方法として、自動化された方法でこの質問に答えるために発明されたSTUNを使用することもできます。SIPWebRTCなどによりインターネット通信で広く使用されています

(debian / ubuntu doでapt-get install stuntman-client)stunclientを使用するのは簡単です:

$ 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に関する私の回答を参照しください (本番用ではなく、楽しい練習用です)。


0

w3m Plaintext-Browserはbashに最適です。を使用greptailて、次のように返信を短縮できます。

w3m -no-cookie -dump "http://www.whatismyip.com/" | grep -A 1 -m 1 "Your IP:" | tail -n 1


0

DNSアドレスを変換するNATルーターの背後であっても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

1
なぜ他のものよりも推奨するのですか?
ロアイマ

@roaimaそのとおりです。決定するのは各ユーザー次第です。
SebMa
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.