Python: Как проверить, открыт ли сетевой порт на linux?

Как я могу узнать, открыт или закрыт определенный порт на linux ubuntu, а не на удаленной системе, используя python? Как я могу перечислить эти открытые порты в python?

  • Netstat: Есть ли способ интегрировать вывод netstat с python?

  • Разбор регулярного выражения Python
  • Как присоединиться к списку строк?
  • pyserial для Python 2.7.2
  • Загрузите холст html5 в изображение PIL с Django
  • python mock Запросы и ответ
  • Как нарисовать форму объединения прямоугольников в python
  • Как я могу использовать pickle для сохранения dict?
  • Ruby-методы эквивалент «if a in list» в python?
  • 7 Solutions collect form web for “Python: Как проверить, открыт ли сетевой порт на linux?”

    Вы можете использовать модуль сокета, чтобы просто проверить, открыт ли порт или нет.

    Это будет выглядеть примерно так.

    import socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) result = sock.connect_ex(('127.0.0.1',80)) if result == 0: print "Port is open" else: print "Port is not open" 

    Если вы заботитесь только о локальной машине, вы можете положиться на пакет psutil. Вы также можете:

    1. Проверьте все порты, используемые определенным pid:

       proc = psutil.Process(pid) print proc.connections() 
    2. Проверьте все порты, используемые на локальном компьютере:

       print psutil.net_connections() 

    Он работает и на Windows.

    http://pythonhosted.org/psutil/

    Если вы хотите использовать это в более общем контексте, вы должны убедиться, что сокет, который вы открываете, также закрывается. Поэтому проверка должна быть более такой:

     import socket from contextlib import closing def check_socket(host, port): with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as sock: if sock.connect_ex((host, port)) == 0: print "Port is open" else: print "Port is not open" 

    Для меня приведенные выше примеры зависали бы, если бы порт не был открыт. В строке 4 показано, как использовать настройку для предотвращения зависания

     import socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(2) #2 Second Timeout result = sock.connect_ex(('127.0.0.1',80)) if result == 0: print 'port OPEN' else: print 'port CLOSED, connect_ex returned: '+str(result) 

    Средство Netstat просто анализирует некоторые файлы / proc, такие как / proc / net / tcp, и объединяет их с другими файлами. Да, это очень специфично для платформы, но для Linux-единственного решения вы можете придерживаться этого. Документация ядра Linux подробно описывает эти файлы, чтобы вы могли найти их, как их читать.

    Также обратите внимание, что ваш вопрос слишком неоднозначен, потому что «порт» также может означать последовательный порт (/ dev / ttyS * и аналоги), параллельный порт и т. Д .; Я снова использовал понимание из другого ответа, это сетевой порт, но я бы попросил вас сформулировать ваши вопросы более точно.

    Просто добавили в решение mrjandro быстрый хак, чтобы избавиться от простых ошибок / тайм-аутов соединения.

    Вы можете изменить пороговое значение переменной max_error_count и добавить уведомления любого типа.

     import socket max_error_count = 10 def increase_error_count(): # Quick hack to handle false Port not open errors with open('ErrorCount.log') as f: for line in f: error_count = line error_count = int(error_count) print "Error counter: " + str(error_count) file = open('ErrorCount.log', 'w') file.write(str(error_count + 1)) file.close() if error_count == max_error_count: # Send email, pushover, slack or do any other fancy stuff print "Sending out notification" # Reset error counter so it won't flood you with notifications file = open('ErrorCount.log', 'w') file.write('0') file.close() sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(2) result = sock.connect_ex(('127.0.0.1',80)) if result == 0: print "Port is open" else: print "Port is not open" increase_error_count() 

    И здесь вы найдете совместимую с Python 3 версию (только фиксированный синтаксис печати):

     import socket max_error_count = 10 def increase_error_count(): # Quick hack to handle false Port not open errors with open('ErrorCount.log') as f: for line in f: error_count = line error_count = int(error_count) print ("Error counter: " + str(error_count)) file = open('ErrorCount.log', 'w') file.write(str(error_count + 1)) file.close() if error_count == max_error_count: # Send email, pushover, slack or do any other fancy stuff print ("Sending out notification") # Reset error counter so it won't flood you with notifications file = open('ErrorCount.log', 'w') file.write('0') file.close() sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(2) result = sock.connect_ex(('127.0.0.1',80)) if result == 0: print ("Port is open") else: print ("Port is not open") increase_error_count() 

    В случае, если вы исследуете TCP-порты с намерением прослушивать их, лучше на самом деле вызвать прослушивание. Подход с tring для подключения не «видит» клиентские порты установленных соединений, потому что никто не слушает его. Но эти порты не могут быть использованы для прослушивания.

     import socket def check_port(port, rais=True): """ True -- it's possible to listen on this port for TCP/IPv4 or TCP/IPv6 connections. False -- otherwise. """ try: sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind(('127.0.0.1', port)) sock.listen(5) sock.close() sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM) sock.bind(('::1', port)) sock.listen(5) sock.close() except socket.error as e: return False if rais: raise RuntimeError( "The server is already running on port {0}".format(port)) return True 
    Python - лучший язык программирования в мире.