所以我在学习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网站是用来扫描的。谢谢!在
如果您更改:
到
^{pr2}$它应该可以工作,但不确定在参数解析中哪里出错了。。在
首先,您误解了命令行的解析方式。在
你通过:
这意味着Python可以看到:
^{pr2}$因此,},因为在该输入字符串中有no
optparse.OptionParser
只将解析为-p
开关的值。结果,options.tgtPort
被设置为'21,'
,并且该值上的.split(', ')
会产生{', '
(逗号和空格)。在要在参数中包含空格,请在命令行中使用引号:
但您确实需要调整命令行解析,使其在逗号上拆分而不是,而不是容忍空格:
另一件需要理解的事情是,使用
.split()
分割字符串将得到一个至少包含一个元素的列表:因此,
tgtPorts[0] == None
的测试将始终是False
。注意,正常的Python习惯用法是使用is
代替None
,因为None
是一个单例。在端口的值中有一个逗号,因此Python无法顺利地将字符串转换为整数。您可以在解释器中轻松重现此异常:
要删除逗号,只需不要在命令行中传入它。或者,如果您确实需要,请处理输入,以便将其转换。在
相关问题 更多 >
编程相关推荐