この記事では主に Python 9 つの連続したアイドル ポートを見つける方法を紹介します。興味のある友人はそれを参照してください
1. プロジェクト要件
特定のソフトウェアをインストールします。ポート設定中にアイドル ポートを埋める必要があります。 5 つのプラットフォームの特定のポートが占有されているかどうかを確認します
5 つのプラットフォームは Windows、linux、aix、hp、solaris です
2 番目に、実装ソリューションは 2 つあります
1 Python のソケット モジュールを使用します
def isInuse(ipList, port): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) flag=True for ip in ipList: try: s.connect((ip, int(port))) s.shutdown(2) print '%d is inuse' % port flag=True break except: print '%d is free' % port flag=False return flag
try モジュールで、s.connect((ip, int(port))) が成功した場合、ポートが占有されていることを意味します
それ以外の場合、connect が失敗した場合は、例外が入ります。ポートが占有されていないことを意味します
しかし、問題があります。ポートによって監視されている IP は、マシンのローカル エリア ネットワーク IP である可能性もあります。 222.25.136.17 など、または通信先のマシンの IP。
この方法で LAN IP を取得できます
def getLocalIp(): localIP = socket.gethostbyname(socket.gethostname()) return localIP
このコードは、接続する ipList = ("127.0.0.1","0.0.0.0",getLocalIp()) のみです
import sys import os import socket def isInuse(ipList, port): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) flag=True for ip in ipList: try: s.connect((ip, int(port))) s.shutdown(2) print '%d is inuse' % port flag=True break except: print '%d is free' % port flag=False return flag def getLocalIp(): localIP = socket.gethostbyname(socket.gethostname()) return localIP def checkNinePort(startPort): flag = True ipList = ("127.0.0.1","0.0.0.0",getLocalIp()) for i in range(1, 10): if (isInuse(ipList, startPort)): flag = False break else: startPort = startPort + 1 return flag, startPort def findPort(startPort): while True: flag, endPort = checkNinePort(startPort) if (flag == True): #ninePort is ok break else: startPort = endPort + 1 return startPort def main(): startPort=51988 # startPort = int(sys.argv[1]) print findPort(startPort) main()
2. netstat の出力情報を使用して、一致するポート番号を見つけます
最初の方法の精度は、connect((ip, int(port))) の IP セットの種類によって異なります。完了しましたか? はい、このポートが占有されていないことを確認できますか?
それでは、次の方法があります
** Linux で netstat -tnpl を使用して、ポート監視情報を取得します。
tcp 0 0 10.173.1.208 を観察します。 :3210 0.0.0.0:* LISTEN 55563/repserver
10.173.1.208:3210 が表示されるため、ポート 3210 が占有されています
この情報を検索します: 5000、存在する場合、ポート 5000 が LISTEN** であることを意味します。出力結果に存在しない場合:5000関連文字で、このポートが占有されていないことを示します。
netstat - tnpl | grep 321 tcp 0 0 10.173.1.208:3211 0.0.0.0:* LISTEN 55563/*** tcp 0 0 0.0.0.0:3212 0.0.0.0:* LISTEN 55586/*** tcp 0 0 10.173.1.208:3213 0.0.0.0:* LISTEN 55707/*** tcp 0 0 0.0.0.0:3214 0.0.0.0:* LISTEN 54272/java tcp 0 0 0.0.0.0:3215 0.0.0.0:* LISTEN 54272/java tcp 0 0 10.173.1.208:3216 0.0.0.0:* LISTEN 54822/*** tcp 0 0 10.173.1.208:3217 0.0.0.0:* LISTEN 34959/*** tcp 0 0 10.173.1.208:3218 0.0.0.0:* LISTEN 54849/***
この考え方に基づいてコードを与えます。
AIX、HP、WINDOWS、LINUX 、SOLARIS、これらのプラットフォームでポート情報を表示する方法が異なります。
最初にマシンのプラットフォームを決定し
、次に各プラットフォームのポート占有決定
関数を呼び出します連続するポートを調べたい場合は、 1 つのポートが占有されている場合は、
ループから抜け出すauthor = 'I316736' import os import platform import sys def isInuseWindow(port): if os.popen('netstat -an | findstr :' + str(port)).readlines(): portIsUse = True print '%d is inuse' % port else: portIsUse = False print '%d is free' % port return portIsUse def isInuseLinux(port): #lsof -i:4906 #not show pid to avoid complex if os.popen('netstat -na | grep :' + str(port)).readlines(): portIsUse = True print '%d is inuse' % port else: portIsUse = False print '%d is free' % port return portIsUse def isInuseAix(port): if os.popen('netstat -Aan | grep "\.' + str(port) + ' "').readlines(): portIsUse = True print '%d is inuse' % port else: portIsUse = False print '%d is free' % port return portIsUse def isInuseHp(port): if os.popen('netstat -an | grep "\.' + str(port) + ' "').readlines(): portIsUse = True print '%d is inuse' % port else: portIsUse = False print '%d is free' % port return portIsUse def isInuseSun(port): if os.popen('netstat -an | grep "\.' + str(port) + ' "').readlines(): portIsUse = True print '%d is inuse' % port else: portIsUse = False print '%d is free' % port return portIsUse def choosePlatform(): #'Windows-7-6.1.7601-SP1' #'AIX-1-00F739CE4C00-powerpc-32bit' #'HP-UX-B.11.31-ia64-32bit' #'Linux-3.0.101-0.35-default-x86_64-with-SuSE-11-x86_64' #'SunOS-5.10-sun4u-sparc-32bit-ELF' machine = platform.platform().lower() if 'windows-' in machine: return isInuseWindow elif 'linux-' in machine: return isInuseLinux elif 'aix-' in machine: return isInuseAix elif 'hp-' in machine: return isInuseHp elif 'sunos-' in machine: return isInuseSun else: print 'Error, sorry, platform is unknown' exit(-1) def checkNinePort(startPort): isInuseFun = choosePlatform() nineIsFree = True for i in range(1, 10): if (isInuseFun(startPort)): nineIsFree = False break else: startPort = startPort + 1 return nineIsFree, startPort def findPort(startPort): while True: flag, endPort = checkNinePort(startPort) if (flag == True): # ninePort is ok break else: startPort = endPort + 1 return startPort def main(startPort): firstPort=findPort(startPort) print 'First port of nine free ports is ', firstPort if name == 'main' : if len(sys.argv) > 1: print len(sys.argv) startPort = int(sys.argv[1]) else: startPort = 500 main(startPort)
os.popen()
のいくつかのシェルコマンドを呼び出すことができますsystem
os.popen().readlines()
readコール シェルコマンド後のエコー情報
netstat -tnpl -tnpl 各个参数的含义 -l或--listening 显示监控中的服务器的Socket。 -n或--numeric 直接使用IP地址,而不通过域名服务器。 -p或--programs 显示正在使用Socket的程序识别码和程序名称。 -t或--tcp 显示TCP传输协议的连线状况 ---------- tcp 0 0 10.173.1.208:4903 0.0.0.0:* LISTEN 54849/jsagent 最后的54849/jsagent 表示 进程号 54849 进程名 jsagent
以上がPython を使用して 9 つの連続するアイドル ポートを見つけるの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。