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

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

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

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

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

承認された回答:

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

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

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

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"

トラブルシューティング

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

関連:外部RAIDドライブからデータを回復しようとしていますか?

別の問題が疑われる場合(アップストリームプロバイダー、コマンドラインツール、またはその他の問題)、+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

Linux
  1. シェルスクリプトを暗号化またはレンダリングして判読不能にする方法は?

  2. 実行する前にシェルスクリプト全体を読む方法は?

  3. 現在のgitブランチの名前をシェルスクリプトの変数に取得する方法は?

  1. シェルで PYTHONPATH を取得するには?

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

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

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

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

  3. コマンドラインから IP アドレスを取得するにはどうすればよいですか?