ホームページ  >  記事  >  バックエンド開発  >  Python を使用して 9 つの連続するアイドル ポートを見つける

Python を使用して 9 つの連続するアイドル ポートを見つける

高洛峰
高洛峰オリジナル
2017-03-13 18:06:451370ブラウズ

この記事では主に Python 9 つの連続したアイドル ポートを見つける方法を紹介します。興味のある友人はそれを参照してください

1. プロジェクト要件

特定のソフトウェアをインストールします。ポート設定中にアイドル ポートを埋める必要があります。 5 つのプラットフォームの特定のポートが占有されているかどうかを確認します

5 つのプラットフォームは Windows、linux、aix、hp、solaris です

2 番目に、実装ソリューションは 2 つあります

1 Python のソケット モジュールを使用します


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 が失敗した場合は、例外が入ります。ポートが占有されていないことを意味します

しかし、問題があります。ポートによって監視されている IP は、マシンのローカル エリア ネットワーク IP である可能性もあります。 222.25.136.17 など、または通信先のマシンの IP。

この方法で LAN IP を取得できます


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


このコードは、接続する ipList = ("127.0.0.1","0.0.0.0",getLocalIp()) のみです


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. netstat の出力情報を使用して、一致するポート番号を見つけます

最初の方法の精度は、connect((ip, int(port))) の 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、これらのプラットフォームでポート情報を表示する方法が異なります。

最初にマシンのプラットフォームを決定し

、次に各プラットフォームのポート占有決定

関数を呼び出します

連続するポートを調べたい場合は、 1 つのポートが占有されている場合は、

ループから抜け出す


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)


関連する知識ポイントの概要

os.popen()
のいくつかのシェルコマンドを呼び出すことができますsystem

os.popen().readlines()
readコール シェルコマンド後のエコー情報

 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


以上がPython を使用して 9 つの連続するアイドル ポートを見つけるの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。