Maison >développement back-end >Tutoriel Python >Utilisez Python pour trouver 9 ports inactifs consécutifs

Utilisez Python pour trouver 9 ports inactifs consécutifs

高洛峰
高洛峰original
2017-03-13 18:06:451400parcourir

Cet article présente principalement la méthode de Python pour trouver 9 ports inactifs consécutifs. Les amis intéressés peuvent se référer à

Exigences du projet

Lors de l'installation d'un certain logiciel, vous devez remplir le port libre lors de la configuration. Vérifier si un certain port des 5 plateformes est occupé

Les 5 plateformes sont windows,

linux, aix, hp, solaris

2. Le plan de mise en œuvre est Deux types de

1. Utilisez


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


dans le module try Si s. connect((ip, int(port))) réussit, cela signifie que le port est occupé.

Sinon, si la connexion échoue, il entrera except, ce qui signifie que le port n'est pas occupé.

Mais il y a un problème En plus de "127.0.0.1" et "0.0.0.0", l'IP surveillée par le port peut également être l'IP du réseau local de la machine comme 222.25.136.17, ou l'IP de la machine. machine communiquant avec elle.

Vous pouvez obtenir l'adresse IP du LAN via cette méthode


def getLocalIp():
  localIP = socket.gethostbyname(socket.gethostname())
  return localIP


Ce code est uniquement pour ipList = ( "127.0.0.1", "0.0.0.0", getLocalIp()) Connectez ces 3 IP


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. Utilisez netstat Informations de sortie pour trouver la correspondance du numéro de port

La précision de la première méthode dépend de l'adresse IP dans connect((ip, int(port))). pas occupé ?

Donc, il existe la méthode suivante

** Utilisez netstat -tnpl sous Linux pour obtenir les informations d'écoute du port,

Observez tcp 0 0 10.173.1.208 : 3210 0.0.0.0:* LISTEN 55563/repserver

10.173.1.208:3210 apparaît, donc le port 3210 est occupé

Recherchez cette information : 5000, si elle existe, cela signifie 5000 Le le port est LISTEN**.

Si les caractères pertinents de :5000 n'existent pas dans le résultat de sortie, cela signifie que le port n'est pas occupé.


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/***


Sur la base de cette idée, donnez le code.

AIX, HP, WINDOWS, LINUX et SOLARIS ont différentes manières d'afficher les informations sur les ports.

Procédez d'abord Déterminez la plate-forme de la machine

puis appelez la fonction de jugement d'occupation des ports

de chaque plate-forme

Si vous souhaitez connaître les ports consécutifs, à condition qu'un le port est occupé, il va sauter

Boucle



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)


Résumé des points de connaissances pertinents

os.popen()
Vous pouvez appeler certaines commandes shell du système

os.popen() .readlines()
Lire les informations d'écho après avoir appelé la commande 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



Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn