Heim  >  Artikel  >  Backend-Entwicklung  >  Verwenden Sie Python, um 9 aufeinanderfolgende inaktive Ports zu finden

Verwenden Sie Python, um 9 aufeinanderfolgende inaktive Ports zu finden

高洛峰
高洛峰Original
2017-03-13 18:06:451360Durchsuche

Dieser Artikel stellt hauptsächlich die Methode von Python vor, um 9 aufeinanderfolgende inaktive Ports zu finden. Interessierte Freunde können sich auf

Projektanforderungen

Bei der Installation einer bestimmten Software müssen Sie bei der Konfiguration den freien Port ausfüllen. Überprüfen Sie, ob ein bestimmter Port der 5 Plattformen belegt ist

Die 5 Plattformen sind Windows,

Linux, Aix, HP, Solaris

2. Der Implementierungsplan ist Zwei Arten von

1. Verwenden Sie


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


im Try-Modul. If s. connect((ip, int(port))) ist erfolgreich, das bedeutet, dass der Port belegt ist.

Andernfalls, wenn die Verbindung fehlschlägt, wird eine Ausnahme eingegeben, was bedeutet, dass der Port nicht belegt ist.

Aber es gibt ein Problem. Zusätzlich zu „127.0.0.1“ und „0.0.0.0“ kann es sich bei der vom Port überwachten IP auch um die lokale Netzwerk-IP der Maschine handeln, z. B. 222.25.136.17, oder die IP des Maschine, die mit ihr kommuniziert.

Sie können die LAN-IP über diese Methode erhalten


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


Dieser Code gilt nur für ipList = ( „127.0. 0.1“, „0.0.0.0“, getLocalIp()) Verbinden Sie diese 3 IPs


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. Verwenden netstat Gibt Informationen aus, um die passende Portnummer zu finden

Die Genauigkeit der ersten Methode hängt von der IP in connect((ip, int(port))) ab. Welche Art von IP-Satz ist vollständig, um diesen Port zu bestimmen? nicht belegt?

Es gibt also die folgende Methode

** Verwenden Sie netstat -tnpl unter Linux, um die Port-Listening-Informationen abzurufen,

Beobachten Sie TCP 0 0 10.173.1.208 : 3210 0.0.0.0:* LISTEN 55563/repserver

10.173.1.208:3210 erscheint, daher ist Port 3210 belegt

Suchen Sie nach dieser Information: 5000, falls vorhanden, bedeutet das 5000 Port ist LISTEN**.

Wenn die relevanten Zeichen von :5000 im Ausgabeergebnis nicht vorhanden sind, bedeutet dies, dass der Port nicht belegt ist.


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


Geben Sie basierend auf dieser Idee den Code an.

AIX, HP, WINDOWS, LINUX und SOLARIS haben unterschiedliche Möglichkeiten, Portinformationen anzuzeigen.

Fahren Sie zuerst fort. Bestimmen Sie die Maschinenplattform

und rufen Sie dann die Portbelegungsbeurteilungsfunktion

jeder Plattform auf

Wenn Sie die aufeinanderfolgenden Ports herausfinden möchten, solange einer Port ist belegt, er springt

Loop



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)


Zusammenfassung relevanter Wissenspunkte

os.popen()
Sie können einige Shell-Befehle des Systems aufrufen

os.popen() .readlines()
Lesen Sie die Echoinformationen nach Aufruf des Shell-Befehls


 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



Das obige ist der detaillierte Inhalt vonVerwenden Sie Python, um 9 aufeinanderfolgende inaktive Ports zu finden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn