How to check if a network port is open on linux?

前端 未结 12 1004
半阙折子戏
半阙折子戏 2020-12-07 11:07

How can I know if a certain port is open/closed on linux ubuntu, not a remote system, using python? How can I list these open ports in python?

  • Netstat: Is th
相关标签:
12条回答
  • 2020-12-07 11:14

    If you want to use this in a more general context, you should make sure, that the socket that you open also gets closed. So the check should be more like this:

    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"
    
    0 讨论(0)
  • 2020-12-07 11:15

    In case when you probing TCP ports with intention to listen on it, it’s better to actually call listen. The approach with tring to connect don’t 'see' client ports of established connections, because nobody listen on its. But these ports cannot be used to listen on its.

    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
    
    0 讨论(0)
  • 2020-12-07 11:21

    Agree with Sachin. Just one improvement, use connect_ex instead of connect, which can avoid try except

    >>> def port_check(ip_port):
    ...     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    ...     s.settimeout(1)
    ...     r = s.connect_ex(ip_port)
    ...     return r == 0
    ... 
    >>> port_check(loc)
    True
    >>> port_check(loc_x)
    False
    >>> loc
    ('10.3.157.24', 6443)
    >>> 
    
    0 讨论(0)
  • 2020-12-07 11:22

    In the Above,I found multiple solutions.But some solutions having a hanging issue or taking to much time in case of the port was not opened.Below solution worked for me :

    import socket 
    
    def port_check(HOST):
       s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
       s.settimeout(2) #Timeout in case of port not open
       try:
          s.connect((HOST, 22)) #Port ,Here 22 is port 
          return True
       except:
          return False
    
    port_check("127.0.1.1")
    
    0 讨论(0)
  • 2020-12-07 11:26

    Netstat tool simply parses some /proc files like /proc/net/tcp and combines it with other files contents. Yep, it's highly platform specific, but for Linux-only solution you can stick with it. Linux kernel documentation describes these files in details so you can find there how to read them.

    Please also notice your question is too ambiguous because "port" could also mean serial port (/dev/ttyS* and analogs), parallel port, etc.; I've reused understanding from another answer this is network port but I'd ask you to formulate your questions more accurately.

    0 讨论(0)
  • 2020-12-07 11:26

    Building upon the psutil solution mentioned by Joe (only works for checking local ports):

    import psutil
    1111 in [i.laddr.port for i in psutil.net_connections()]
    

    returns True if port 1111 currently used.

    psutil is not part of python stdlib, so you'd need to pip install psutil first. It also needs python headers to be available, so you need something like python-devel

    0 讨论(0)
提交回复
热议问题