Linux Bash スクリプトでパブリック IP を取得する方法
公開: 2022-11-12コンピューターにリモート接続する場合は、外部 IP アドレスが必要になります。 手動で見つけるのは簡単ですが、Linux スクリプト内から見つける方法を次に示します。
内部および外部 IP アドレス
インターネット プロトコル アドレスは、ネットワーク上のデバイスを識別するために使用されます。 これらはネットワーク上で一意のラベルであり、1 つのデバイスに割り当てられます。 別のデバイスがそのデバイスにデータを送信したい場合は、その 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 を 178.238.11.140 として報告しています。 Web ページを下にスクロールすると、サイトから情報を取得するために使用できるコマンドのリストが表示されます。
彼らが提供する例はすべてcurl
を使用してサイトに問い合わせています。 それでは、 curl
の使い方を見てみましょう。
カールの使用
私たちのテスト マシンでは、Fedora 37 にはすでにcurl
がインストールされていました。 Ubuntu と Manjaro コンピューターにインストールする必要がありました。
Ubuntu にインストールするには、次のように入力します。
sudo apt install curl
Manjaro のコマンドは次のとおりです。
sudo pacman -S カール
ifconfig.me
Web ページにリストされている最初のコマンドでこれを試すことができます。
カールifconfig.me
外部 IP アドレスが取得され、ターミナル ウィンドウに表示されます。 出力は必要最小限です。 文字列の後に印刷される改行文字さえありません。 コマンド プロンプトは、IP アドレスと突き合わせられます。
このコマンドが機能するのは、IP アドレスを返すことが Web サイトのデフォルト アクションであるためです。 デフォルトのアクションが変更された場合、別の結果が返される可能性があります。 これに対応するために、URL に「ip」識別子を追加して、IP アドレスを要求していることを指定できます。
カール ifconfig.me/ip
これにより、以前と同様に IP アドレスが返されます。
これは、Web サイトを IP アドレスのソースとして使用する際の問題を示しています。 Web サイトは閉鎖されるか、運用方法や返される情報の形式が変更される可能性があります。 これらの変更により、これらのサイトに依存するスクリプトが失敗するか、予期しない動作をするようになります。
DNS サーバーのような評判が良く信頼できるリソースを使用することは、外部 IP を取得するためのより確実な方法です。 DNS サーバーにクエリを実行するには、dig コマンドを使用する必要があります。
関連: DNS とは何ですか? 別の DNS サーバーを使用する必要がありますか?
dig コマンドの使用
今回は Fedora と Ubuntu にdig
をインストールし、Manjaro にインストールするだけで済みました。
このコマンドは通常のpacman
コマンドなので驚くことはありませんが、パッケージ名は予想とは異なります。
sudo pacman -S bind-tools
dig
を使用して外部 IP アドレスを検出するには、それを DNS サーバーに向ける必要があります。 Cisco が提供する OpenDNS サーバーを使用しています。
使用する DNS サーバーの名前を指定する必要があります。先頭にアットマーク「@」を付けます。 また、取得したいレコード タイプに名前を付ける必要があります。 この場合は「myip」です。 +short
オプションを指定すると、冗長な応答ではなく、簡潔な応答が得られます。
掘る@resolver1.opendns.com myip.opendns.com +short
今回は、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
スクリプトを実行して、何が得られるか見てみましょう。
./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
このスクリプトを実行してみましょう。
./getex2.sh
2 つのスクリプトの出力から、コマンドdig
がコマンド ラインに改行文字を出力しているにもかかわらず、スクリプトではextaddr
変数に改行が追加されていないことがわかります。
信頼性を求めて
「非公式」の Web サイトを使用するよりも、評判が良く、出力形式が予測可能な、認知されているサービスを使用する方が常に安全です。 インターネット上の他のすべてのものと同様に、情報を誰から入手しているかをよく見てください。
関連: Linux スクリプトが仮想マシンで実行されていることを検出する方法