web-dev-qa-db-ja.com

Python-同じアプリケーションを実行しているネットワーク上のコンピューターのIPアドレスとホスト名を取得します

明確にするために:私はちょうど2週間前にPythonを始めましたが、私はC#、ASP、PHP、JavaScript開発者です。

PythonとPyQtを使用して新しいプロジェクトを開始しました。プロジェクトを、他のコンピューター上のこのサーバーの他のインスタンスと通信できるサーバーにしたいです。

したがって、コンピューターのIPアドレスとホスト名を取得する必要があります。

最初に、MSDOSの「netview」コマンドを使用することを考えましたが、これは私の仕事でこのコマンドを試す前であり、これには約15秒かかることがわかりました(遅すぎると思います)。

私はからこのアイデアを持っていました: https://stackoverflow.com/a/15497083/1598891

また、「net view」コマンドは、ネットワーク上に存在しなくなったコンピューターを返し、ホスト名でIPアドレスを取得しようとすると例外が発生する可能性があります(これにより、コンピューターにアクセスできなくなるたびにプロセスが遅くなります)。

私の質問:net viewは遅い操作になる可能性があるため、Windowsでnet viewを通過せずに、ローカルネットワーク上のすべてのコンピューターのIPとホスト名を取得する方法はありますか?

また、アプリケーションを実行しているコンピューターのみを取得する方法はありますか?(より高速になります)

前もって感謝します

7
RPDeshaies

pythonスクリプトが実行されているホストのIPアドレスを取得する場合は、user2096338行く方法です。

LAN内のネットワーク上のすべてのコンピューターを検出するには、 scapy を使用できます。 https://github.com/bwaldvogel/neighbourhood/blob/master/neighbourhood.py は、閲覧中に見つけたリンクです 類似 SO質問;ネットワーク(LAN)内のすべてのコンピューターを検出します。

上記のスクリプトがサーバーを実行しているコンピューターのみを返すようにしたい場合は、複数の方法があり、移植性の順に以下にリストされています。

  1. サーバーをホストにインストールするたびに、サーバーを中央データベースに登録します。中央データベースは、サービスの新しいインスタンスによって照会され、ピアサーバーが実行されているすべてのコンピューターを識別できます。
  2. WMIを使用して(Windowsを使用しているため)、ピアシステムで実行されているすべてのプロセスにクエリを実行し、サーバープロセスがその中の1つであるかどうかを確認します。
  3. サーバーはプロービングポートを開いたままにし、新しいサーバーインストールは、ネットワーク内の各ホストのこのプロービングポートでサーバーにpingを実行します。応答があった場合、このコンピューターはサーバープロセスを実行しています。

私の意見では、方法1は、セキュリティホールである不要なポート(方法3など)が開かないようにするため、最も安全で移植性があります(コンテキストに応じて、pythonスクリプトが実行されます)。また、リモートホストでのWMIサービスの可用性にも依存しません(一部のシステムではWMIが無効になっている場合があります)。

お役に立てれば

5

ローカルホストのホスト名とIPには、ソケットモジュールとgethostname、およびgethostbynameメソッドを使用できます。

import socket

hostname = socket.gethostname()
IP = socket.gethostbyname(hostname)
20
Peter Party Bus