Search code examples
pythonsocketsports

Python: Have to press ctrl+c to get an result


I am trying to create a python script to check if an port is available or not. Below is a piece of the code (not the total script).

But when I run the script the terminal shows no output, when I press ctrl + c I get an single result of the script, when I hit ctrl+c again I get the second result. When the script is done it finally quits...

#!/usr/bin/python

import re
import socket
from itertools import islice

resultslocation = '/tmp/'
f2name = 'positives.txt'
f3name = 'ip_addresses.txt'
f4name = 'common_ports.txt'

#Trim down the positive results to only the IP addresses and scan them with the given ports in the common_ports.txt file

with open(resultslocation + f2name, 'r') as f2, open(resultslocation + f3name, 'w') as f3:
    hits = f2.read()
    list = re.findall(r'name = (.+).', hits)
    for items in list:
        ip_addresses = socket.gethostbyname(items)
        with open(resultslocation + f4name, 'r') as f4:
            for items in f4:
                ports = int(items)
                s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                try:
                    s.connect((ip_addresses, ports))
                    s.shutdown(2)
                    print 'port', ports, 'on', ip_addresses, 'is open'
                except:
                    print 'port', ports, 'on', ip_addresses, 'is closed'

What am I doing wrong?

Thanks in advance!


Solution

  • By default, sockets are created in blocking mode.

    So in general it is recommended to call settimeout() before calling connect() or pass a timeout parameter to create_connection() and use that instead of connect. Since you code already captures exceptions, the first option is easy to implement;

    with open(resultslocation + f2name, 'r') as f2, open(resultslocation + f3name, 'w') as f3:
        hits = f2.read()
        list = re.findall(r'name = (.+).', hits)
        for items in list:
            ip_addresses = socket.gethostbyname(items)
            with open(resultslocation + f4name, 'r') as f4:
                for items in f4:
                    ports = int(items)
                    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                    s.settimeout(1.0) # Set a timeout (value in seconds).
                    try:
                        s.connect((ip_addresses, ports))
                        s.shutdown(2)
                        print 'port', ports, 'on', ip_addresses, 'is open'
                    except:
                        # This will alse catch the timeout exception.
                        print 'port', ports, 'on', ip_addresses, 'is closed'