linux 端口tnpl,利用Python找出9个连续的空闲端口

这篇文章主要介绍了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 sysimport osimport socketdef 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 flagdef getLocalIp(): localIP = socket.gethostbyname(socket.gethostname()) return localIPdef 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, startPortdef findPort(startPort): while True: flag, endPort = checkNinePort(startPort) if (flag == True): #ninePort is ok break else: startPort = endPort + 1 return startPortdef 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 321tcp 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/javatcp 0 0 0.0.0.0:3215 0.0.0.0:* LISTEN 54272/javatcp 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 osimport platformimport sysdef 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 portIsUsedef 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 portIsUsedef 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 portIsUsedef 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 portIsUsedef 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 portIsUsedef 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, startPortdef findPort(startPort): while True: flag, endPort = checkNinePort(startPort) if (flag == True): # ninePort is ok break else: startPort = endPort + 1 return startPortdef main(startPort): firstPort=findPort(startPort) print 'First port of nine free ports is ', firstPortif name == 'main' : if len(sys.argv) > 1: print len(sys.argv) startPort = int(sys.argv[1]) else: startPort = 500 main(startPort)

相关知识点总结

os.popen()可以调用系统的一些shell命令

os.popen().readlines()读取调用shell命令后的回显信息

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/332645.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

go比java快多少_Java 11快多少?

go比java快多少尽管大多数开发人员仍然使用Java 8 ,但Java 11还是在不久前发布的。 让我们看看其中哪个对OptaPlanner更快。 找出答案的最佳方法当然是运行OptaPlanner基准测试。 本文是我们针对Java 8的类似文章的后续文章 。 基准方法 为了运行基准测试&#xff…

部署项目,所谓“部署”到底是在干什么?

第一步:把项目部署包放在服务器指定目录(webapps)下,让服务器可以找到项目资源;或者通过配置文件让服务器可以找到项目资源。 第二步:把项目的访问路径、资源映射等数据加载进内存中,这样客户端…

linux查看文件使用情况,linux查看文件句柄使用情况

Linux 3.2.0-23-generic (linux) 09/08/2014 _x86_64_ (8 CPU)02:01:55 PM dentunusd file-nr inode-nr pty-nr02:02:05 PM 38465 1568 25731 402:02:15 PM 38465 1568 25728 402:02:25 PM 38465 1536 25723 4Average: 38465 1557 25727 4输出项说明:kbmemfree&…

Update resources 和 Update classes and resources 的特殊情况

resources目录的文件删除了,不会更新部署包中的相关文件;但是会更新编译输出目录下的相关文件(在 run 和 debug 模式下) webapp 目录的文件删除了,不会更新部署包中的相关文件(在 run 和 debug 模式下&…

java堆内与堆外数据交互_Java:汇总堆外数据

java堆内与堆外数据交互探索如何以最小的垃圾回收影响和最大的内存利用率创建堆​​外聚合。 使用Java Map,List和Object创建大型聚合通常会产生大量堆内存开销。 这也意味着,一旦聚合超出范围,垃圾收集器将必须清理这些对象。 阅读这篇简短…

linux内核cpu负载计算,CPU 负载 — The Linux Kernel documentation

CPU 负载Linux通过/proc/stat和/proc/uptime导出各种信息,用户空间工具如top(1)使用这些信息计算系统花费在某个特定状态的平均时间。例如:$ iostatLinux 2.6.18.3-exp (linmac) 02/20/2007avg-cpu: %user %nice %system %iowait %steal %idle10.01 0.00…

IntelliJ IDEA 中的Java Web项目的资源文件复制新增如何更新到部署包中?

文章目录resources目录下的文件复制新增webapp目录的文件复制新增IntelliJ IDEA 中的Java Web项目的资源文件如果复制新增,正常的重新部署、重启服务器、update resources,并不会更新到部署包中,必须要特殊处理才行。 resources目录下的文件…

apache.camel_Apache Camel 2.23发布

apache.camel昨天发布了Apache Camel 2.23 ,其中最值得注意的新功能是对Spring Boot 2.1的支持,我们还改进了启动器组件以包括更多的元数据,并对改进的Spring Boot自动配置进行了优化。 此版本主要是一个大的错误修复版本和一些其他小的新增…

在linux上安装mysql5.6,在linux(Centos 7以上版本亲测)上安装mysql5.6

./scripts/mysql_install_db --usermysql --datadir/usr/local/mysql/data/mysql如果执行报错[rootdc1atmpapp12 mysql]# ./scripts/mysql_install_db --usermysql --datadir/usr/local/mysql/data/mysql FATAL ERROR: please install the following Perl modules before execu…

NewServlet ‘***Servlet‘ already exists inthis Web facet.

使用模板创建了一个 Servlet,创建 Servlet 时没有勾选“Create Java EE 6 annotated class”,再把该 Servlet 删除掉,再创建同名的 Servlet,IDEA 就会报错:NewServlet ‘***Servlet’ already exists in this Web face…

payara 创建 集群_Apache Payara:让我们加密

payara 创建 集群前一段时间,我写了一个小教程 ,介绍如何生成“让我们加密SSL”证书并将其安装在Glassfish Java EE平台上。 这个技巧对我来说是一个奇迹,但是每三个月必须手动更新和重新安装证书变得很烦人。 我做了一些研究,并…

腾讯为什么不开发linux软件下载,你认为国产操作系统如何搭建生态?为什么腾讯不给Linux系统适配QQ?...

Linux的软件少主要是,十几二十年前,要在Linux上开发软件,要遵循开源协议,也就意味着你在上面开发个的公开应用都得开源,至少得公开一部分,所以很多商业闭源应用都绕过了Linux。现在随着Linux的分支越来越多…

Download Apache Commons BeanUtils

下载地址:https://commons.apache.org/proper/commons-beanutils/download_beanutils.cgi

stripe pay_J2Pay –实施网关

stripe pay介绍 如果您使用任何网关,您都可以在我们的库中实现该网关并支持开源世界,我们将非常高兴地欢迎贡献者。 您可以在这里找到我们的github存储库 在开始实现网关之前,您应该首先看到其他一些类。 以下是简要定义的类。 HTTP客户端…

linux l文件共享,llinux服务器文件共享的一种简单的方法

如果Centos虚拟机没有安装文件共享功能,那么客户端与服务器文件共享会产生一些困扰;这里有一个小的方法,可以快速实现linux服务器与windows共享;这里以CentOS 6.4 版本为例;通过xshell链接到服务器上;要在l…

BeanUtils的学习

BeanUtils 用于将数据封装成 JavaBean。 什么是 JavaBean 一种标准的 Java 类 要求: 1.类必须被public修饰 2.必须提供空参的构造器 3.成员变量必须使用private修饰 4.提供公共setter和getter方法 功能: JavaBean用于封装数据 主要的方法 popular&a…

java方法可选参数_Java可选参数

java方法可选参数在Java类中设计方法时,某些参数对于其执行而言可能是可选的。 无论是在DTO,胖模型域对象还是简单的无状态服务类中,可选方法参数都是常见的。 从本文中, 您将学习如何在Java中处理可选参数 。 我们将专注于常规方…

linux清空串口接收buff,openwrt解除console对串口的占用

console对串口的占用openwrt会将串口配置成console便于用户控制,以本人使用的WNDR4300为例打开盒子后可以看到一个串口被引出,开机后能够打印bootloder以及linux的启动日志。在启动到一定阶段之后可以作为console登陆有时候希望自己的程序占用串口来发送…

Druid Spring JDBC Servlet 实现登录功能

Druid 数据库连接池的实现技术 Spring JDBC 需要使用数据库连接池,Spring JDBC 提供非常好用的查询数据、插入数据、更新数据的API 开发步骤: 1.数据库的设计(创建数据库、数据表) 2.创建 Java EE 项目 3.导入相关的 jar 包 comm…

世界是沙粒还是宇宙_看到一个沙粒世界:再一次你好世界

世界是沙粒还是宇宙“看到一个沙粒中的世界”,我们很可能会看到最简单的“ Hello World”中的世界,所以我们开始吧,再一次向世界问好。 我猜所有的Java课程,教程都是从这个著名的Hello World程序开始的,这是我可以在没…