GNU/Linux >> Linux の 問題 >  >> Linux

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

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

以下の他の回答のほとんどは、HTTP 経由でリモート サーバーに接続することを含みます。それらのいくつかは、出力の解析を必要としたり、User-Agent ヘッダーに依存してサーバーにプレーン テキストで応答させたりしていました。それらは非常に頻繁に変更されます (ダウンする、名前を変更する、広告を掲載する、出力形式を変更する可能性があるなど)。

<オール>
  • DNS 応答プロトコルは標準化されています (形式は互換性を維持します)。
  • 歴史的に、DNS サービス (Akamai、Google パブリック DNS、OpenDNS など) は、最新のヒップな whatismyip ドットコム HTTP サービスよりもはるかに長く存続し、安定性と拡張性に優れ、一般的により面倒を見る傾向にあります。今日。
  • この方法は本質的に高速です (わずか数ミリ秒です!)
  • dig の使用 OpenDNS リゾルバーを使用:

    $ dig @resolver4.opendns.com myip.opendns.com +short
    

    おそらくあなたの bashrc でそれをエイリアスします 覚えやすいので

    # https://unix.stackexchange.com/a/81699/37512
    alias wanip='dig @resolver4.opendns.com myip.opendns.com +short' 
    alias wanip4='dig @resolver4.opendns.com myip.opendns.com +short -4'
    alias wanip6='dig @resolver1.ipv6-sandbox.opendns.com AAAA myip.opendns.com +short -6'
    

    プレーン IP アドレスで応答:

    $ wanip # wanip4, or wanip6
    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 Public DNS など、さまざまな DNS プロバイダーがこのサービスを提供しています:

    # OpenDNS (since 2009)
    $ dig @resolver3.opendns.com myip.opendns.com +short
    $ dig @resolver4.opendns.com myip.opendns.com +short
    80.100.192.168
    
    # OpenDNS IPv6
    $ dig @resolver1.ipv6-sandbox.opendns.com AAAA myip.opendns.com +short -6
    2606:4700:4700::1111
    
    # Akamai (since 2009)
    $ dig @ns1-1.akamaitech.net ANY whoami.akamai.net +short
    80.100.192.168
    
    # Akamai approximate
    # NOTE: This returns only an approximate IP from your block,
    # but has the benefit of working with private DNS proxies.
    $ dig +short TXT whoami.ds.akahelp.net
    "ip" "80.100.192.160"
    
    # Google (since 2010)
    # Supports IPv6 + IPv4, use -4 or -6 to force one.
    $ dig @ns1.google.com TXT o-o.myaddr.l.google.com +short
    "80.100.192.168"
    

    具体的に IPv4 アドレスを要求するエイリアスの例:

    # https://unix.stackexchange.com/a/81699/37512
    alias wanip4='dig @resolver4.opendns.com myip.opendns.com +short -4'
    
    $ wanip4
    80.100.192.168
    

    IPv6 アドレスの場合:

    # https://unix.stackexchange.com/a/81699/37512
    alias wanip6='dig @ns1.google.com TXT o-o.myaddr.l.google.com +short -6'
    
    $ wanip6
    "2606:4700:4700::1111"
    

    トラブルシューティング

    コマンドが何らかの理由で機能しない場合は、ネットワークに問題がある可能性があります。最初に上記の代替手段のいずれかを試してください。

    別の問題 (アップストリーム プロバイダー、コマンドライン ツール、またはその他のもの) が疑われる場合は、+short なしでコマンドを実行します。 DNS クエリの詳細を明らかにするオプション。例:

    $ dig @resolver4.opendns.com myip.opendns.com
    
    ;; Got answer: ->>HEADER<<- opcode: QUERY, status: NOERROR
    
    ;; QUESTION SECTION:
    ;myip.opendns.com.      IN  A
    
    ;; ANSWER SECTION:
    myip.opendns.com.   0   IN  A   80.100.192.168
    
    ;; Query time: 4 msec
    

    注:これは外部に関するものです IP アドレス (インターネット上のサーバーに接続したときにサーバーが認識するもの) - 内部が必要な場合 IP アドレス (自分のコンピュータが接続に使用しているもので、異なる場合があります) こちらの回答をご覧ください .

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

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

    dig +short myip.opendns.com @resolver4.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 スクリプトのソースです:

    • https://raw.githubusercontent.com/rsp/scripts/master/externalip-benchmark

    自分で実行して、ここに記載されているどのサービスを使用する価値があるかを確認できます:

    wget https://raw.githubusercontent.com/rsp/scripts/master/externalip-benchmark
    chmod a+x externalip-benchmark
    ./externalip-benchmark
    

    2015 年 4 月 3 日にワルシャワから得た結果 - 無実の人々を保護するためにアドレスが変更されました:

    最高の 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 年 4 月 3 日にアムステルダムから得た結果は次のとおりです。

    最高の 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 年 6 月 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 リゾルバーでは可能性が低いかもしれません - 外部 IP スクリプトで IP を使用する必要があるかもしれません - コメントしてください)。

    Telnet

    nc の Telnet または telnet コマンド (上記を参照) は、通常次のようになります:

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

    (nc の間に顕著な違いはありません と telnet コマンド)

    FTP

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

    ドメイン名

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

    コメント

    あなたの場所から興味深い結果が得られた場合、または私が選択したホストの代わりに他のホストを推奨する必要があると思われる場合は、コメントを投稿してください.重要なサービスが不足している場合は、コメントするか、GitHub に問題を投稿してください。この投稿を最新の状態に保ち、現在最も優れたサービスを選択できるようにしたいと思います。


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

    サイトをオランダの作業サイトに置き換えました。


    Linux
    1. シェルスクリプトでフォークされた子プロセスから PID を取得する方法

    2. 期待されるシェルスクリプトで生成されたプロセスの終了コードを取得するには?

    3. シェル スクリプトを使用して MAC アドレスを取得する

    1. 外部のpythonスクリプトでDjangoシェルでコードを実行するには?

    2. 簡単なシェルスクリプトでディストリビューション名とバージョン番号を取得するにはどうすればよいですか?

    3. Bash スクリプトでホスト名を IP アドレスに解決するにはどうすればよいですか?

    1. 簡単なシェルスクリプトで配布名とバージョン番号を取得するにはどうすればよいですか?

    2. シェルスクリプトで外部IPアドレスを取得する方法は?

    3. シェルスクリプトで一時ファイルを作成するにはどうすればよいですか?