技術ノート Linux Linux Bash スクリプトでパブリック IP を取得する方法

Linux Bash スクリプトでパブリック IP を取得する方法

Linux Bash スクリプトでパブリック IP を取得する方法

重要なポイント

「curl -s ifconfig.me」などのcurlコマンドを使用して、Webサイトから外部IPを取得できます。ただし、Web サイトは変更される可能性があります。より信頼性の高い答えを得るには、代わりに「dig @resolver1.opendns.com myip.opendns.com +short」のような dig コマンドを使用して、DNS サーバーから IP を取得します。

コンピュータにリモート接続する場合は、外部 IP アドレスが必要になります。手動で見つけるのは簡単ですが、Linux スクリプト内から見つける方法は次のとおりです。

内部および外部 IP アドレス

インターネット プロトコル アドレスは、 ネットワーク上のデバイスを識別するために使用されます。これらはネットワーク上で一意のラベルであり、単一のデバイスに割り当てられます。別のデバイスがそのデバイスにデータを送信したい場合は、その IP アドレスを使用して送信できます。

ブロードバンド モデムにはネットワーク ルーターが組み込まれており、ネットワーク上のネットワーク トラフィックをデバイスからデバイスに転送します。また、デバイスがネットワークに参加するときにデバイスに IP アドレスを割り当てるのも地方自治体です。また、ネットワーク名と IP アドレスのテーブルも維持します。これにより、人間にとっては数値のリストよりも名前の方が扱いやすいため、ネットワーク上のコンピュータに意味のある名前を付けることができます。

インターネット上のデバイスにも IP アドレスがあります。ウェブサイトなど、名前が付いているものもあります。 ドメイン ネーム サービス プロバイダーは、Web サイトのドメイン名を検索し、それを IP アドレスと自動的に交換します。

ブロードバンド モデムには、 インターネット サービス プロバイダー (ISP) によって、インターネットに接続する独自の IP アドレスまたは外部 IP アドレスが与えられます。インターネットに接続されている家庭内のデバイスの数に関係なく、それらの合計トラフィックはすべて、その単一の IP アドレスを介して送信されます。

外出先から、自宅のコンピュータで実行されているサービスに接続したい場合は、外部 IP アドレスを使用する必要があります。もちろん、接続リクエストを自宅内の適切なデバイスにルーティングするように ルーター を設定する必要があります。

静的 IP アドレス に対して毎月 ISP に追加料金を支払わない限り、外部 IP アドレスは時々変更される可能性があります。ブロードバンド モデムを再起動すると、別の外部 IP アドレスが取得される可能性があります。したがって、外部 IP アドレスを知る必要がある場合、それを一度確認して保存するだけでは済みません。それが何であるかを定期的に判断する必要があります。

Linux Bash スクリプトでパブリック IP を取得する方法

外部 IP アドレスを見つける

外部 IP アドレスを検出するということは、ネットワークの外側にある何かと通信することを意味します。言い換えれば、インターネット上で必要な情報を入手できるものにアクセスすることです。私たちは虚空を覗いて、何が私たちを振り返っているのかを見る必要があります。そして、外部アドレスを尋ねます。

これを行うには 2 つの方法があります。 1 つの方法には Web サイトが関係します。外部 IP アドレスやその他の情報を表示する Web サイトはたくさんあります。これらにはブラウザーでアクセスすることも、 HTTPS リクエストを作成できる curl などのコマンドライン ツールを使用することもできます。

もう 1 つの方法は、 dig のような専用コマンドを使用することです。 dig コマンドは、DNS サーバーに問い合わせて情報を取得します。

Linux Bash スクリプトでパブリック IP を取得する方法

ブラウザの使用

もちろん、ブラウザを使用して外部 IP アドレスを取得するのは、スクリプトに適した方法ではありません。しかし、そのサービスを提供する Web サイトを見ると、有益な情報が得られることがあります。以前は ip4.me を推奨していましたが、サイトは HTTPS に更新されていませんでした。古い、安全でない HTTP が依然として使用されています。このサイトはまだ機能していますが、より良い代替手段が登場しました。

ifconfig.me サイトには、優れた情報セットが提供されています。

これは外部 IP を 178.238.11.140 として報告しています。 Web ページを下にスクロールすると、サイトから情報を取得するために使用できるコマンドのリストが表示されます。

彼らが挙げる例はすべて、 curl 使用してサイトに問い合わせます。それでは、 curl 使い方 を見てみましょう。

カールの使用

私たちのテスト マシンでは、 Fedora 37 にはすでに curl インストールされていました。これを Ubuntu および Manjaro コンピューターにインストールする必要がありました。

Ubuntu にインストールするには、次のように入力します。

 Sudo apt installカール

Manjaro でのコマンドは次のとおりです。

 sudo パックマン -S カール

ifconfig.me Web ページにリストされている最初のコマンドを使用して、これを試すことができます。

カール ifconfig.me

外部 IP アドレスが取得され、ターミナル ウィンドウに表示されます。出力は最低限のものです。文字列の後には改行文字さえ出力されません。コマンド プロンプトは IP アドレスに突き当たります。

IP アドレスを返すことが Web サイトのデフォルトのアクションであるため、このコマンドは機能します。デフォルトのアクションが変更されると、異なる結果が返される可能性があります。これに対応するには、URL に「ip」識別子を追加することで、IP アドレスを要求していることを指定できます。

 ifconfig.me/ip をカールします

これにより、以前と同様に IP アドレスが返されます。

これは、Web サイトを IP アドレスのソースとして使用する場合の問題を示しています。 Web サイトは閉鎖されたり、運営方法や返される情報の形式が変更されたりする可能性があります。これらの変更により、これらのサイトに依存する スクリプト が失敗するか、予期しない動作をするようになります。

DNS サーバーなどの評判が良く信頼できるリソースを使用することは、外部 IP を取得するためのより堅牢な方法です。 DNS サーバーにクエリを実行するには、dig コマンドを使用する必要があります。

Linux Bash スクリプトでパブリック IP を取得する方法

dig コマンドの使用

今回はFedoraとUbuntuに dig をインストールしており、Manjaroにインストールするだけで済みました。

このコマンドは通常の pacman コマンドなので驚くことはありませんが、パッケージ名は予想されるものとは異なります。

 sudo pacman -S バインドツール

dig 使用し て外部 IP アドレスを検出するには、それが DNS サーバーを指すようにする必要があります。 Cisco が提供する OpenDNS サーバーを 使用しています。

使用する DNS サーバーの名前を、先頭にアットマーク「@」を付けて指定する必要があります。取得するレコード タイプに名前を付ける必要もあります。この場合は「myip」です。 +short オプションを使用すると、冗長な応答ではなく、簡潔な応答が得られます。

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

今回は、IP アドレスの後に改行文字が出力されます。後で説明するように、これは IP アドレス文字列の後に出力され、文字列自体の不可欠な部分ではありません。

Linux Bash スクリプトでパブリック IP を取得する方法

スクリプトでのこれらの使用

スクリプト内から外部 IP アドレスを知りたい理由はたくさんあります。おそらく、外部 IP アドレスが変更されたかどうかを監視し、変更があった場合に通知するスクリプトがあるかもしれません。あるいは、サーバーはアドレスが変更されたときにクライアントに通知する可能性があります。理由が何であれ、コマンド ラインで使用したコマンドをスクリプト内に非常に簡単に実装できます。

外部 IP アドレスを取得して 変数 に割り当てるには、次のようにコマンドをコマンド置換 $(...) 内にラップして変数に割り当てるだけです。

変数=$(...)

括弧内のコマンドが実行され、戻り値が式に置き換えられます。この例では、コマンドは「変数=戻り値」に簡略化されています。

ここではスクリプト内で説明します。データ取得の進行状況が報告されないように、 curl コマンドに -s (サイレント) オプションを追加しました。

 #!/bin/bash

extaddr=$(curl -s ifconfig.me)

echo “外部 IP アドレスは $extaddr (cURL から)”

このスクリプトをエディタにコピーし、「getex1.sh」という名前で保存し、 chmod コマンド で実行できるようにします。

 chmod +x getex1.sh

スクリプトを実行して、何が得られるかを見てみましょう。

 ./getex1.sh

Web サイトではなく DNS サーバーを使用するというより堅牢なオプションで同じことを行うには、 curl コマンドを dig コマンドに置き換えるだけです。

 #!/bin/bash

extaddr=$(dig @resolver1.opendns.com myip.opendns.com +short)

echo “外部 IP アドレスは $extaddr (dig から)”

これをスクリプト「getex2.sh」として保存し、 chmod で実行可能にします。

 chmod +x getex2.sh

このスクリプトを実行してみましょう。

 ./getex2.sh

2 つのスクリプトの出力から、コマンド dig がコマンド ラインに改行文字を出力しているにもかかわらず、スクリプトでは extaddr 変数に改行が追加されていないことがわかります。

Linux Bash スクリプトでパブリック IP を取得する方法

信頼性を追求する

「非公式」 Web サイトを使用するよりも、評判が高く、出力形式が予測可能な、認知されたサービスを使用する方が常に安全です。インターネット上の他のあらゆるものと同様に、情報を誰から入手しているのかをよく確認してください。」

「 Linux Bash スクリプトでパブリック IP を取得する方法」に関するベスト動画選定!

【7分で解説】Linux入門|bash( .bashrcに環境変数を追加するのはなぜ? )
【仕事が楽になる!】bash スクリプトで面倒な作業を自動化しよう!【シェルスクリプト】【インフラエンジニア】【情報処理安全確保支援士】【ハッカー】