Python找出9个连续的空闲端口
|
一、项目需求 安装某软件,配置时候需要填写空闲的端口。查看5个平台的某个端口是否被占用 5个平台为windows,linux,aix,hp,solaris 二、实现方案有两种 1、利用 python 的 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
在try 模块中 如果 s.connect((ip,int(port))) 如果能成功,说明端口被占用. 否则,connect 不成功,会进到except 中,说明端口不被占用. 但是有个问题,端口监听的ip 除了 "127.0.0.1","0.0.0.0" 还有可能是本机的局域网ip 如 222.25.136.17 , 或者与之通信的那台机器的ip。 可以通过这个方法获得局域网 ip def getLocalIp(): localIP = socket.gethostbyname(socket.gethostname()) return localIP 本代码只针对 ipList = ("127.0.0.1","0.0.0.0",getLocalIp()) 这3个 ip 进行 connect
import sys
import os
import socket
def isInuse(ipList,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",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,到底怎样的 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 这几个平台查看端口信息的方式不同, 先进行机器平台的判断 然后调用各个平台的端口占用判断函数 如果要找出连续端口,其中只要有一个端口占用,就跳出循环
__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,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() os.popen().readlines() 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 以上就是本文的全部内容,希望对大家的学习有所帮助。 (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
