web-dev-qa-db-ja.com

PythonのローカルネットワークからのIPアドレス/ホスト名のリスト

Pythonで簡単にローカルネットワークからIPアドレスまたはホスト名のリストを取得するにはどうすればよいですか?

マルチプラットフォームであれば最適ですが、最初にMac OS Xで動作する必要があり、次に他のユーザーがそれに続きます。

編集:ローカルとは、すべてを意味しますアクティブローカルネットワーク内のアドレス(192.168.xxx.xxxなど)。

そのため、(ローカルネットワーク内の)コンピューターのIPアドレスが192.168.1.1で、他に3台のコンピューターが接続されている場合、IPアドレス192.168.1.2192.168.1.3を返します。 、192.168.1.4、および場合によってはそれらのホスト名。

36
Josh Hunt

「ローカル」とは、同じネットワークセグメントを意味する場合、次の手順を実行する必要があります。

  1. 独自のIPアドレスを決定する
  2. 独自のネットマスクを決定する
  3. ネットワーク範囲を決定する
  4. すべてのアドレスをスキャンします(ネットワークアドレスである最低アドレスと、ブロードキャストアドレスである最高アドレスを除く)。
  5. DNSの逆ルックアップを使用して、スキャンに応答するIPアドレスのホスト名を決定します。

または、Python nmapを外部で実行し、結果をプログラムにパイプで戻すことができます。

18
Steve Moyer

Update:スクリプトは github に配置されました。

small python scriptscapyarping()を活用する)を書きました。

20

コンピューターの名前がわかっている場合は、次を使用できます。

import socket
IP1 = socket.gethostbyname(socket.gethostname()) # local IP adress of your computer
IP2 = socket.gethostbyname('name_of_your_computer') # IP adress of remote computer

そうでない場合は、別の回答に記載されているように、ローカルコンピューター(IP1)と同じマスクに従うすべてのIPアドレスをスキャンする必要があります。

10
Mapad

試してください:

import socket

print ([ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if not ip.startswith("127.")][:1])
3
user870774

私はこれを見つけました python記事 のネットワークスキャナー)=この短いコードを書きました。あなたが望むことをします!ただし、デバイスのアクセス可能なポートを知る必要があります。ポート22 sshの標準であり、私が使用しているものです。すべてのポートでループできると思います。デフォルトは次のとおりです。

linux: [20, 21, 22, 23, 25, 80, 111, 443, 445, 631, 993, 995]
windows: [135, 137, 138, 139, 445]
mac: [22, 445, 548, 631]
import socket

def connect(hostname, port):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    socket.setdefaulttimeout(1)
    result = sock.connect_ex((hostname, port))
    sock.close()
    return result == 0

for i in range(0,255):
    res = connect("192.168.1."+str(i), 22)
    if res:
        print("Device found at: ", "192.168.1."+str(i) + ":"+str(22))
0
Grebtsew