我正在努力通过‘暴力的Python’。我在第2章中,当我试图运行以下代码时,我会收到这个语法错误:
python2 portscanner.py -H perl6.org -p 21, 22, 80
“21,”扫描结果为:"/home/wolf/python/Violent-Python-Examples/Chapter-2/portscan.py",扫描端口21,跟踪(最近一次调用):文件"/home/wolf/python/Violent-Python-Examples/Chapter-2/portscan.py",第53行,main() File "/home/wolf/python/Violent-Python-Examples/Chapter-2/portscan.py",第49行,main portScan(tgtHost,tgtPorts)文件“/home/wolf/python/Violent-Python-Examples/Chapter-2/portscan.py”,第32行,在portScan connScan(tgtHost,int(tgtPort)) ValueError中:带基10:'21‘的int()无效文字
我主要是从代码中直接复制它,但是我做了一些事情使它成为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()发布于 2018-07-15 03:46:07
您正在解析的选项只是寻找一个端口-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就可以了。或者就像Tripleee指出的,把引号放在论点周围。
如果您需要支持不带引号的多个参数,则此问题将有所帮助:Processing multiple values for one single option using getopt/optparse?
顺便说一句,如果它让你感觉更好,这是一个问题的原始未经修改的代码,从这本书。本书的Python2代码对于本书所建议的命令也会产生同样的错误。
https://stackoverflow.com/questions/51344943
复制相似问题