我正在使用Python制作网站组件扫描程序。不幸的是,当我在脚本中添加另一个值时出现了问题。这是我的剧本:
#!/usr/bin/python
import sys
import urllib2
import re
import time
import httplib
import random
# Color Console
W = '\033[0m' # white (default)
R = '\033[31m' # red
G = '\033[1;32m' # green bold
O = '\033[33m' # orange
B = '\033[34m' # blue
P = '\033[35m' # purple
C = '\033[36m' # cyan
GR = '\033[37m' # gray
#Bad HTTP Responses
BAD_RESP = [400,401,404]
def main(path):
print "[+] Testing:",host.split("/",1)[1]+path
try:
h = httplib.HTTP(host.split("/",1)[0])
h.putrequest("HEAD", "/"+host.split("/",1)[1]+path)
h.putheader("Host", host.split("/",1)[0])
h.endheaders()
resp, reason, headers = h.getreply()
return resp, reason, headers.get("Server")
except(), msg:
print "Error Occurred:",msg
pass
def timer():
now = time.localtime(time.time())
return time.asctime(now)
def slowprint(s):
for c in s + '\n':
sys.stdout.write(c)
sys.stdout.flush() # defeat buffering
time.sleep(8./90)
print G+"\n\t Whats My Site Component Scanner"
coms = { "index.php?option=com_artforms" : "com_artforms" + "link1","index.php?option=com_fabrik" : "com_fabrik" + "ink"}
if len(sys.argv) != 2:
print "\nUsage: python jx.py <site>"
print "Example: python jx.py www.site.com/\n"
sys.exit(1)
host = sys.argv[1].replace("http://","").rsplit("/",1)[0]
if host[-1] != "/":
host = host+"/"
print "\n[+] Site:",host
print "[+] Loaded:",len(coms)
print "\n[+] Scanning Components\n"
for com,nme,expl in coms.items():
resp,reason,server = main(com)
if resp not in BAD_RESP:
print ""
print G+"\t[+] Result:",resp, reason
print G+"\t[+] Com:",nme
print G+"\t[+] Link:",expl
print W
else:
print ""
print R+"\t[-] Result:",resp, reason
print W
print "\n[-] Done\n"
这是出现的错误消息:
Traceback (most recent call last):
File "jscan.py", line 69, in <module>
for com,nme,expl in xpls.items():
ValueError: need more than 2 values to unpack
我已经尝试将2值更改为3或1,但它似乎不起作用。
答案 0 :(得分:2)
xpls.items
会返回两个项目的元组,您尝试将其解压缩为三个。你用两对key:value
:
coms = { "index.php?option=com_artforms" : "com_artforms" + "link1","index.php?option=com_fabrik" : "com_fabrik" + "ink"}
此外,回溯似乎来自另一个脚本 - dict在那里被称为xpls
,并且在你发布的代码中被coms
...
答案 1 :(得分:1)
你可以尝试
for (xpl, poc) in xpls.items():
...
...
因为dict.items
会返回带有2个值的元组。
答案 2 :(得分:0)
您拥有所需的所有信息。与任何错误一样,最好的起点是追溯。让我们来:
for com,poc,expl in xpls.items():
ValueError: need more than 2 values to unpack
当给定对象的类型正确但值不正确时,Python会抛出ValueError
。在这种情况下,这告诉我们xpls.items
是iterable
,因此可以解压缩,但尝试失败。
异常描述缩小了问题:xpls
有2个项目,但需要更多项目。通过查看引用行,我们可以看到“更多”是3。
简而言之:xpls
应该有3个项目,但有2个。
请注意,我从未阅读其余代码。仅使用这两行就可以进行调试。
学习阅读追溯是至关重要的。当您再次遇到此错误时,请至少花10分钟尝试使用此信息。你的努力将会十倍地偿还。
答案 3 :(得分:0)
如前所述,dict.items()返回一个包含两个值的元组。如果您使用字符串列表作为字典值而不是字符串(之后应该拆分),您可以使用以下语法:
coms = { "index.php?option=com_artforms" : ["com_artforms", "link1"],
"index.php?option=com_fabrik" : ["com_fabrik", "ink"]}
for com, (name, expl) in coms.items():
print com, name, expl
>>> index.php?option=com_artforms com_artforms link1
>>> index.php?option=com_fabrik com_fabrik ink