暴力Python:端口输入没有被分开

2024-09-29 19:30:39 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我在学习Python和hacking的同时,从“暴力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()

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

^{pr2}$

谁能帮忙吗?我在这方面还是新手,但我猜Python没有通过运行以下命令来分隔我输入的不同端口:

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

我的目标是scanme.org网站是用来扫描的。谢谢!在


Tags: importparsertargetportdefsocketprinttry
3条回答

如果您更改:

t = Thread(target=connScan, args=(tgtHost, int(tgtPort)))

^{pr2}$

它应该可以工作,但不确定在参数解析中哪里出错了。。在

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

你通过:

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

这意味着Python可以看到:

^{pr2}$

因此,optparse.OptionParser只将解析为-p开关的值。结果,options.tgtPort被设置为'21,',并且该值上的.split(', ')会产生{},因为在该输入字符串中有no', '(逗号和空格)。在

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

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,因为None是一个单例。在

端口的值中有一个逗号,因此Python无法顺利地将字符串转换为整数。您可以在解释器中轻松重现此异常:

>>> int("2,")

Traceback (most recent call last):
File "<pyshell#27>", line 1, in <module>
int("2,")
ValueError: invalid literal for int() with base 10: '2,'
>>> int("2")
2

要删除逗号,只需不要在命令行中传入它。或者,如果您确实需要,请处理输入,以便将其转换。在

相关问题 更多 >

    热门问题