代码之家  ›  专栏  ›  技术社区  ›  Jonathan Dewein

ch.2 python语法错误:valueerror:无效的int()文本,基10:'21,'

  •  0
  • Jonathan Dewein  · 技术社区  · 6 年前

    我正在努力通过“暴力巨蟒”。我在第2章中,尝试运行以下代码时收到此语法错误:

    python2 portscanner.py -H perl6.org -p 21, 22, 80

    [21,][+]扫描结果:www.p6c.org扫描端口21,回溯 (最近一次呼叫最后一次):文件 “/home/wolf/python/viole python examples/chapter-2/portscan.py”, 第53行,英寸 main()文件“/home/wolf/python/暴力python示例/chapter-2/portscan.py”, 第49行,主 portscan(tgthost,tgtports)file“/home/wolf/python/viole python examples/chapter-2/portscan.py”, 行32,在端口扫描中 connscan(tgthost,int(tgtport))valueerror:以10为基的int()的无效文本:“21,”

    我主要是直接从代码中复制它,但是我做了一些事情使它成为python3而不是python2,例如为 print() 功能。但是,我对python还不熟悉,我不明白这里的问题是什么。我想是因为 split() 方法?

    import optparse
    import socket
    from socket import *
    
    
    def connScan(tgtHost, tgtPort):
        try:
            connSkt = socket(AF_INET, SOCK_STREAM)
            connSkt.connect((tgtHost, tgtPort))
            connSkt.send('ViolentPython\r\n')
            results = connSkt.recv(100)
            print('[+]%d/tcp open' % tgtPort)
            connSkt.close()
        except:
            print('[-]%d/tcp closed' % tgtPort)
    
    
    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(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='string',
                          help='specify target port')
        (options, args) = parser.parse_args()
        tgtHost = options.tgtHost
        tgtPorts = str(options.tgtPort).split(', ')
        print(tgtPorts)
        if (tgtHost is None) | (tgtPorts[0] is None):
            print('[-] You must specify a target host and port[s].')
            exit(0)
        portScan(tgtHost, tgtPorts)
    
    
    if __name__ == '__main__':
        main()
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Zev    6 年前

    正在分析的选项只是在查找一个端口 -p <target port> 所以它切断了“21”之后的一切。

    str(options.tgtPort).split(', ') 正在查找逗号和空格。 "21," 只有逗号。

    Split by comma and strip whitespace in Python 如果需要二者分开,但实际上,只需发送命令 python2 portscanner.py -H perl6.org -p 21 它应该是有效的。或者正如Triplee指出的那样,只需在论点周围加上引号。

    如果需要支持不带引号的多个参数,此问题将有助于: Processing multiple values for one single option using getopt/optparse?

    顺便说一句,如果它能让你感觉更好的话,这就是本书中未修改的原始代码的问题。本书的python 2代码给出了与本书建议的命令相同的错误。