Skip to main content
 首页 » 编程设计

python之暴力 python : port inputs not being seperated

2025年05月04日20小虾米

所以我在学习 Python 的同时从“Violent Python”开始黑客攻击,我遇到了一个问题 这是我的代码:

import optparse 
import socket 
from socket import * 
from threading import * 
 
screenLock = Semaphore(value = 1) 
 
def connScan(tgtHost, tgtPort): 
    try: 
        connSkt = socket(AF_INET, SOCK_STREAM) 
        connSkt.connect((tgtHost, tgtPort)) 
        connSkt.send('ViolentPython\r\n') 
        results = connSkt.recv(100) 
        screenLock.acquire() 
        print '[+]%d/tcp open' %tgtPort 
        print '[+] ' + str(results) 
    except: 
        screenLock.acquire() 
        print '[-]%d/tcp closed' %tgtPort 
    finally: 
        screenLock.release() 
        connSkt.close() 
def portScan(tgtHost, tgtPorts): 
    try: 
        tgtIP = gethostbyname(tgtHost) 
    except: 
        print "[-] Cannot resolve '%s': Unknown host" %tgtHost 
        return 
    try: 
        tgtName = gethostbyaddr(tgtIP) 
        print '\n[+] Scan Results for ' +tgtName[0] 
    except: 
        print '\n[+] Scan Results for ' +tgtIP 
    setdefaulttimeout(10) 
    for tgtPort in tgtPorts: 
        print 'Scanning port ' +tgtPort 
        t = Thread(target=connScan, args=(tgtHost, int(tgtPort))) 
        t.start() 
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='string', \ 
        help='specify target port[s] seperated by a 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) 
    portScan(tgtHost, tgtPorts) 
if __name__ == '__main__': 
    main() 

运行程序我收到以下错误消息:

  File "port_scanner.py", line 54, in <module> 
    main() 
  File "port_scanner.py", line 52, in main 
    portScan(tgtHost, tgtPorts) 
  File "port_scanner.py", line 37, in portScan 
    t = Thread(target=connScan, args=(tgtHost, int(tgtPort))) 
ValueError: invalid literal for int() with base 10: '21,' 

有人可以帮忙吗?我对此还是个新手,但我猜 Python 不会通过运行此命令来分隔我输入的不同端口:

python port_scanner.py -H 74.207.244.221 -p 21, 22, 80 

我定位的 ip 是 scanme.org,用于扫描。谢谢!

请您参考如下方法:

首先,您误解了命令行的解析方式。

你传入:

python port_scanner.py -H 74.207.244.221 -p 21, 22, 80 

这意味着 Python 看到:

['-H', '74.207.244.221', '-p', '21,', '22,', '80'] 

optparse.OptionParser 因此解析just '21,' 作为-p 的值转变。因此,options.tgtPort 被设置为 '21,',并且对该值的 .split(', ') 导致 ['21,'] 因为该输入字符串中没有 ', '(逗号和空格)。

要在参数中包含空格,请在命令行中使用引号:

python port_scanner.py -H 74.207.244.221 -p "21, 22, 80" 

但您真的想调整命令行解析以仅分隔逗号并容忍空格:

tgtPorts = [p.strip() for p in options.tgtPort.split(',')] 

另一件需要理解的事情是,使用 .split() 拆分字符串将生成一个包含至少一个元素的列表:

>>> 'foo'.split(',') 
['foo'] 

因此您对 tgtPorts[0] == None 的测试将始终为 False。请注意,正常的 Python 习语是使用 is 代替 None(tgtPorts[0] is None),因为 None 是单例。