子育てしながらエンジニアしたい

現在 7 歳 女の子の子育て中エンジニアによる、技術系 + 日常系ブログ。

Python で自身の IP アドレスを取得したい - Ubuntu 編

以前、Python から自身の IP アドレスを取得するという記事を書きました。

edosha.hatenablog.jp

これは Windows ではいけたのですが、Ubuntu ではループバックアドレスしか取得できないことがわかりました。
そこで Ubuntu で IP アドレスを取得する方法を見つけたので、改めて公開します。

Python socket モジュールで自身の IP アドレスを取得する (Ubuntu)

実行環境は Python 3.6.5 / Ubuntu 18.04.1 LTS です。

$ python3 --version
Python 3.6.5 :: Anaconda, Inc.

標準ライブラリの socket モジュールを使います。

リモートソケットに接続する socket API

以下の2種類の API があります。

  • socket.connect(address)
  • socket.connect_ex(address)

どちらも address に示されるリモートソケットに接続されます。
違いは、connect_ex ではエラーが発生した場合でも例外が送出されないところです。
詳しくは以下のリンクをご覧ください。

socket --- 低水準ネットワークインターフェイス — Python 3.8.2rc1 ドキュメント

たとえばデフォルトゲートウェイ(192.168.100.1とか)の80番ポートなどを指定するには

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect((192.168.100.1, 80))

こんな感じで接続できます。

接続中の IP アドレスとポートを取得する socket API

  • socket.getsockname()

上記の API でどこかに接続されているとき、その接続元である自分自身の IP とポートを表示します。
上の例に続いて s.getsockname() を実行すると下記のようになります。

s.getsockname()
# ('192.168.100.10', 60321) 等が出力される

上記を組み合わせて、自身の IP アドレスを取得する

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect((192.168.100.1, 80))
ip = s.getsockname()[0]

こんな感じで、ip に IP アドレスの文字列が取得できました。