Почему Python говорит, что я даю 64 аргумента для функции, когда я даю только 1 каждый раз с циклом for?

#python #multithreading

Вопрос:

Я совершаю атаку по словарю с хэшами SHA-256 из Violent Python, и у меня есть функция, которая проверяет хэш и проверяет, соответствует ли он паролю. Тогда у меня есть функция main ().

Программа открывает файл словаря и таблицу в стиле UNIX с пользователями и их хэш-паролями. Я использую потоки для проверки всех слов сразу и использую цикл for для их проверки:

 from hashlib import *
from os import chdir
from pathlib import Path
from threading import Thread
from time import sleep

chdir(Path.home() / 'Downloads')
dict = open('dictionary.txt')

def test(encrypted):
    for word in dict.readlines():
        hash = sha256()
        word = word.strip('n')
        hash.update(bytes(word))
        if hash.hexdigest() == encrypted:
            print('Match!:'   word)
        else:
            return null
def main():
    users = open('users.txt')
    for line in users.readlines():
        user = line.split(':')[0]
        encrypted = line.split(':')[1].strip(' ')
        print('cracking for'   user   '...')
        t = Thread(target = test, args = encrypted)
        t.start()
main()
sleep(200)
 

Python выдает мне эту ошибку, хотя:

 TypeError: test() takes 1 positional argument but 64 were given
 

Я думаю, что Python думает, что я пытаюсь проверить все словарные слова сразу, но это невозможно, потому что в моем словаре нет 64 слов, но я не могу найти в коде ничего неправильного.

 apple
orange
egg
lemon
grapes
secret
strawberry
password
 

Вот это users.txt:

 victim: 34707c3f40dfa20c3902b807b627d420d6d474d9d98066ba637953d1cfd6b914: 503:100:Iama Victim:/home/victim:/bin/sh
root: 3a7bd3e2360a3d29eea436fcfb7e44c735d117c42d1c1835420b6b9942dd4f1b: 504:100: Markus Hess:/root:/bin/bash
 

Комментарии:

1. encrypted имеет длину 64 символа, вы должны прочитать, что args означает, когда вы создаете Thread : docs.python.org/3/library/threading.html#threading. Нитки

2. @jonrsharpe Так мне следует поместить его в кортеж?

3. Попробуйте; имеет ли это какое-то значение?

4. @jonsharpe Да, это так. Но по какой-то причине это работает только тогда, когда я ставлю запятую после этого, как написал copyrighttc. Спасибо!

5. Запятая-это то, что делает его кортежем , если бы вы просто сделали args=(encrypted) это, это не имело бы никакого значения.

Ответ №1:

Ключевое слово args потока принимает кортеж

Это может сработать :

 t = Thread(target = test, args = (encrypted,))
 

Кроме null того, в python нет ничего подобного, но none