AttributeError с `argparse` - PullRequest
       37

AttributeError с `argparse`

0 голосов
/ 30 января 2019

Итак, я переписываю ZIP Cracker, опубликованный на Violent Python TJ O'Connor, написанный на Python 2.7.Автор использовал optparse, но я пошел с argparse.

Мой код выглядит следующим образом:

import argparse
from threading import Thread
import zipfile
import io

parser = argparse.ArgumentParser(description="Unzips selected .zip using a dictionary attack", usage="CRARk.py -z zipname.zip -f file.txt")

# Creates -z arg
parser.add_argument("-z", "--zip", metavar="", required=True, help="Location and the name of the .zip file.")

# Creates -f arg
parser.add_argument("-f", "--file", metavar="", required=True, help="Location and the name of the word-list/dictionary-list/password-list.")
args = parser.parse_args()


def extract_zip(zipFile, password):
    try:
        zipFile.extractall(pwd=password.encode())
        print("[+] Password for the .zip: {0}".format(password) + "\n")
    except:
        pass


def main(zip, dictionary):
    if (zip == None) | (dictionary == None):
        print(parser.usage)
        exit(0)
    zip_file = zipfile.ZipFile(zip)
    pass_file = io.open(dictionary, mode="r", encoding="utf-8")
    for line in pass_file.readlines():
        password = line.strip("\n")
        t = Thread(target=extract_zip, args=(zip_file, password))
        t.start()


if __name__ == '__main__':
    # USAGE - Project.py -z zipname.zip -f file.txt
    main(args.zip, args.dictionary)

И ошибка, которую я получаю:

Traceback (most recent call last):
  File "C:\Users\User\Documents\Jetbrains\PyCharm\Project\Project.py", line 39, in <module>
    main(args.zip, args.dictionary)
AttributeError: 'Namespace' object has no attribute 'dictionary'

Теперь я немного не уверен, что это значит.Я попытался переименовать args.dictionary в args.file или тому подобное, но в итоге я получил пустой ответ на моем терминале, когда я запустил код.Как показано на следующем рисунке, при правильном запуске .py нет ответа / вывода и т. Д.

imageargs.file is used instead of args.dictionary">

Как это исправить?

1 Ответ

0 голосов
/ 30 января 2019

С argparse частью вашего кода:

import argparse
parser = argparse.ArgumentParser(description="Unzips selected .zip using a dictionary attack", usage="CRARk.py -z zipname.zip -f file.txt")

# Creates -z arg
parser.add_argument("-z", "--zip", metavar="", required=True, help="Location and the name of the .zip file.")

# Creates -f arg
parser.add_argument("-f", "--file", metavar="", required=True, help="Location and the name of the word-list/dictionary-list/password-list.")
args = parser.parse_args()
print(args)

Примеры выполнения:

2033:~/mypy$ python3 stack54431649.py -h
usage: CRARk.py -z zipname.zip -f file.txt

Unzips selected .zip using a dictionary attack

optional arguments:
  -h, --help    show this help message and exit
  -z , --zip    Location and the name of the .zip file.
  -f , --file   Location and the name of the word-list/dictionary-
                list/password-list.
1726:~/mypy$ python3 stack54431649.py
usage: CRARk.py -z zipname.zip -f file.txt
stack54431649.py: error: the following arguments are required: -z/--zip, -f/--file
1726:~/mypy$ python3 stack54431649.py -z zippy -f afile
Namespace(file='afile', zip='zippy')

Это означает, что я могу получить доступ к значениям с помощью

args.file    # 'afile'
args.zip     # 'zippy'
main(args.zip, args.file)

В main

if zip is None:    # better than zip == None

но так как эти 2 аргумента обязательны, они никогда не будут None.

Оттуда возникает вопрос, является ли значение zip именемдействительный файл zip, и можете ли вы открыть dictionary.

...