>백엔드 개발 >파이썬 튜토리얼 >Python을 사용하여 9개의 연속 유휴 포트 찾기

Python을 사용하여 9개의 연속 유휴 포트 찾기

高洛峰
高洛峰원래의
2017-03-13 18:06:451395검색

이 글에서는 9개의 연속 유휴 포트를 찾는 Python 방법을 주로 소개합니다. 관심 있는 친구는

1. 프로젝트 요구 사항을 참조하세요. >특정 소프트웨어를 설치할 때 구성 중에 사용 가능한 포트를 채워야 합니다. 5개 플랫폼 중 특정 포트가 점유되어 있는지 확인

5개 플랫폼은 windows,

linux

, aix, hp, Solaris

2. 구현 계획

의 두 가지 유형입니다. 1. s.connect( (ip, int(port))) 성공하면 포트가 점유되어 있다는 의미입니다.

그렇지 않으면 연결에 실패하면 Except가 들어가는데 이는 포트가 점유되지 않았다는 의미입니다.

그런데 문제가 있습니다. "127.0.0.1"과 "0.0.0.0" 외에 포트 모니터링 IP가 222.25.136.17과 같은 기기의 LAN IP이거나 통신하는 기기의 IP일 수도 있습니다. 그것으로.


이 방법으로 LAN IP를 얻을 수 있습니다


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

이 코드는 ipList = ("127.0 전용입니다. .0.1" ,"0.0.0.0",getLocalIp()) 이 3개의 IP를 연결

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


2. netstat 출력 정보를 사용하여 일치하는 포트 번호 찾기

첫 번째 방법의 정확성은 connect((ip, int(port)))의 IP에 따라 달라집니다. 이 포트가 점유되지 않도록 하려면 어떤 종류의 IP 세트가 완료되어야 합니까?

그래서 다음과 같은 방법이 있습니다


** Linux에서 netstat -tnpl을 사용하여 포트 모니터링 정보를 얻으세요.

tcp 0 0 10.173.1.208:3210 0.0 관찰 .0.0 ; *.

출력 결과에 :5000의 해당 문자가 없으면 이 포트가 비어 있다는 의미입니다.

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()

이 아이디어를 바탕으로 코드가 부여됩니다.

AIX, HP, WINDOWS, LINUX, SOLARIS는 포트 정보를 보는 방법이 다릅니다.

먼저 기계 플랫폼을 결정하십시오

그런 다음 각 플랫폼의 포트 점유 판단

기능을 호출하십시오


연속 포트를 알고 싶다면 하나의 포트가 점유되어 있는 한 ,

루프에서 벗어나


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

요약 관련 지식 포인트

os.popen()

시스템의 일부 쉘 명령 호출 가능


os.popen().readlines()

셸 명령 호출 후 에코 정보 읽기

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)

위 내용은 Python을 사용하여 9개의 연속 유휴 포트 찾기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.