This is the script
import nmap
import optparse
def nmapScan(tgtHost,tgtPort):
nmScan = nmap.PortScanner()
nmScan.scan(tgtHost,tgtPort)
state=nmScan[tgtHost]['tcp'][int(tgtPort)]['state']
print "[*] " + tgtHost + " tcp/"+tgtPort +" "+state
def main():
parser = optparse.OptionParser('-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='string', help='specify target port[s] separated by comma')
(options, args) = parser.parse_args()
tgtHost = options.tgtHost
tgtPorts = str(options.tgtPort).split(',')
if (tgtHost == None) | (tgtPorts[0] == None):
print parser.usage
exit(0)
for tgtPort in tgtPorts:
nmapScan(tgtHost, tgtPort)
if __name__ == '__main__':
main()
When I try to enter a range of ports in the command line, I get this error. Could someone help me out? I'm a newbie to python. Thanks in advance!!
:~$ python nmapScan.py -H 192.168.1.6 -p 20-25
Traceback (most recent call last):
File "nmapScan.py", line 27, in <module>
main()
File "nmapScan.py", line 23, in main
nmapScan(tgtHost, tgtPort)
File "nmapScan.py", line 7, in nmapScan
state=nmScan[tgtHost]['tcp'][int(tgtPort)]['state']
ValueError: invalid literal for int() with base 10: '20-25'
Like I said in a comment you should really use some try/excepts to avoid your script crashing.
As per the documentation you can use
nmap.PortScanner()
which takes a string in the form20-25
for a range which you could just use that in your script, parse the dict to get the output and make your life easier:We can shorten your script using the proper nmap syntax:
You need to distinguish between those two different formats, and if the
m-n
range format is used, split at '-' to get the boundaries, create the list of port usingrange()
, and settgtPorts
to that range.Here's a function to implement this. You can simply plug it into your code by doing
instead of your current
tgtPorts = str(options.tgtPort).split(',')
:Note however that this still does not support the full nmap port range specification syntax. You can only use a comma separated list, or a range defined by
m-n
, but not both.See the documentation for
range()
andmap()
for details on how those functions work.