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

公開: 2022-11-12
Linux コマンド プロンプトを表示している青色の背景のラップトップ。
Fatmawati achmad zaenuri/Shutterstock.com
"curl -s ifconfig.me" のような curl コマンドを使用して、Web サイトから外部 IP を取得できます。 ただし、Web サイトは変更される可能性があります。 より信頼性の高い回答を得るには、「dig @resolver1.opendns.com myip.opendns.com +short」のような代わりに dig コマンドを使用して、DNS サーバーから IP を取得します。

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

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

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

IP アドレスの仕組み
関連IP アドレスはどのように機能しますか?

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

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

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

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

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

外部 IP アドレスの検索

外部 IP アドレスを検出するということは、ネットワークの外部にある何かと通信することを意味します。 つまり、必要な情報を提供してくれるインターネット上の何かにアクセスすることです。 虚空をのぞいて、何が自分たちを振り返っているのかを確認する必要があります。 次に、外部アドレスを尋ねます。

これには 2 つの方法があります。 1 つの方法には、Web サイトが含まれます。 外部 IP アドレスやその他の情報を表示する Web サイトは多数あります。 ブラウザーでこれらにアクセスするか、HTTPS 要求を行うことができるcurlなどのコマンドライン ツールを使用できます。

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

ブラウザの使用

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

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

外部 IP アドレスを表示する ifconfig.me Web サイト

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

一連の cURL コマンドを表示する ifconfig.me Web サイト

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

カールの使用

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

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

 sudo apt install curl 

Ubuntu にカールをインストールする

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

 sudo pacman -S カール

マンジャロにカールをインストールする

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

 カールifconfig.me 

ifconfig.me ウェブサイトのデフォルト アクションを使用して外部 IP アドレスを取得する

外部 IP アドレスが取得され、ターミナル ウィンドウに表示されます。 出力は必要最小限です。 文字列の後に印刷される改行文字さえありません。 コマンド プロンプトは、IP アドレスと突き合わせられます。

curl を使用して Linux コマンドラインからファイルをダウンロードする方法
関連curl を使用して Linux コマンドラインからファイルをダウンロードする方法

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

 カール ifconfig.me/ip 

ifconfig.me Web サイトで ip specfier を使用して外部 IP アドレスを取得する

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

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

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

関連: DNS とは何ですか? 別の DNS サーバーを使用する必要がありますか?

dig コマンドの使用

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

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

 sudo pacman -S bind-tools 

Manjaroにdigをインストールする

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

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

 掘る@resolver1.opendns.com myip.opendns.com +short 

dig コマンドを使用して DNS サーバーから外部 IP アドレスを取得する

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

関連: Linux で dig コマンドを使用する方法

これらをスクリプトで使用する

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

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

 変数=$(...)

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

関連: Bash で変数を操作する方法

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

 #!/ビン/バッシュ

extaddr=$(curl -s ifconfig.me)

echo "外部 IP アドレスは $extaddr (cURL から) です"

このスクリプトをエディタにコピーし、「getex1.sh」として保存し、 chmodコマンドで実行可能にします。

 chmod +x getex1.sh 

chmod でスクリプトを実行可能にする

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

 ./getex1.sh 

getex1.sh スクリプトの実行

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

 #!/ビン/バッシュ

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

echo "外部 IP アドレスは $extaddr です (dig から)"

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

 chmod +x getex2.sh 

chmod でスクリプトを実行可能にする

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

 ./getex2.sh 

getex2.sh スクリプトの実行

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

信頼性を求めて

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

関連: Linux スクリプトが仮想マシンで実行されていることを検出する方法