pythonoptparse

Optparse - how to parse multiple port in Port Scanner (Violent Python)


I am trying to do the port scanner from the Violent Python and I ran into following problem. This post will be similar to this post ("https://stackoverflow.com/questions/17807992/violent-python-port-inputs-not-being-seperated") but it is a different problem. I want to run multiple port like this

python PortScanner.py -H www.google.com -p 21, 22, 80

but it scanned only the initial first port (21) then exited the program So I want to know how can I fix this code to run multiple ports.

Note: It also said that args in (option, args) = parser.parse_args() is not accessible by Pylance so is it concern to it or how can I fix it as well.

import optparse
import socket
from socket import *
def connscan(tgtHost,tgtPorts):
    try:
        connSkt= socket(AF_INET,SOCK_STREAM)
        connSkt.connect((tgtHost, tgtPorts))
        connSkt.send('Violent Python\r\n')
        results = connSkt.recv(100)
        print ('[+]%d/tcp open'% tgtPorts)
        print ('[+]' + str(results))
        connSkt.close()
    except: 
        print ('[-]%d/tcp closed'% tgtPorts)

def PortScan(tgtHost,tgtPorts):
    try:
        tgtIP=gethostbyname(tgtHost)
    except:
        print ("[-] Cannot resolve '%s': Unkown host"%tgtHost)
        return
    try:
        tgtName= gethostbyaddr(tgtIP)
        print ("\n[+] Scan Result for:   "+ tgtName[0])
    except:
        print ("\n[+] Scan Result for: " + tgtIP)
        setdefaulttimeout(1)
        for tgtPort in tgtPorts:
            print ("Scanning Port " + tgtPort)
            connscan(tgtHost,int(tgtPort))

def main():

    parser = optparse.OptionParser('Usage: %prog -H ' +\
    '<target host> -p <target port>')
    parser.add_option('-H', dest = 'tgtHost', type = 'string', \
    help = 'specify target host')
    parser.add_option('-p', dest = 'tgtPort', type = 'int', \
    help = 'Specify target port' )
    (options,args) = parser.parse_args()
    tgtHost = options.tgtHost
    tgtPorts = str(options.tgtPort).split(',')
    
    if ( tgtHost == None) | (tgtPorts[0] == None):
        print(parser.usage)
        exit (0)
    print(*tgtPorts, sep=", ")
    PortScan(tgtHost,tgtPorts)

if __name__ == '__main__':
    main()

Solution

  • I managed to solve the problem by changing the type of tgtPort from int to string and use quote as following at the command line python PortScanner.py -H www.google.com -p "21, 22, 80".