2016-05-29 15 views
0

Ich habe eine einfache Funktion, die den gleichen subprocess.popen Befehl auf mehrere Elemente aus einer Liste aufruft. Es führt die ersten 2 Elemente in der Liste kein Problem, jedoch die Aktion auf dem dritten hängt.Ich habe Probleme mit Pythons `subprocess.popen` hängen

Es scheint, dass die process_null.communicate() nie ausgeführt oder zumindest nicht beendet, wie ich nie die Ausgabe von dem 3. Element in der Liste bekomme. Ich habe versucht, die Liste zu ändern, aber die gleichen Ergebnisse zu erhalten. Irgendwelche Ideen, was hier passiert?

def check_list(server_list): 
    null_list = [] 

    for target in server_list: 
     command_null="rpcclient -N -U '' {}". format (str(target)) 
     process_null = subprocess.Popen(command_null, shell=True, stdout=subprocess.PIPE,stderr=subprocess.STDOUT) 
     output_null = process_null.communicate()[0].replace('\n','') 

     if "NT_STATUS_ACCESS_DENIED" in output_null or "NT_STATUS_CONNECTION_REFUSED" in output_null or "NT_STATUS_UNSUCCESSFUL" in output_null: 
      print '[-] ' + target + '\tDenied NULL Session' 
     else: 
      print '[+] ' + target + '\tAccepted NULL Session' 
      null_list.append(target) 


    return null_list 

Output

[-] 192.168.1.3 Denied NULL Session 
[-] 192.168.1.65 Denied NULL Session 

Antwort

2

Wenn rpcclient baut erfolgreich eine Verbindung er eine Schale beginnt und wartet auf Befehle auf stdin eingetragen werden, wenn nicht angegeben werden unter Verwendung der -c Flag, das ist das, was hier passiert, . Die Eingabeaufforderung wird nicht angezeigt, da Sie die gesamte Ausgabe (stdout + stderr) an eine Pipe umleiten, aber Sie tun das nicht für stdin, was bedeutet, dass die Eingabe von demselben tty gelesen wird, auf dem der Python-Interpreter ausgeführt wird.

Außerdem sollten Sie nicht shell=True mit einem String-Argument verwenden, wenn nicht unbedingt erforderlich, eine Liste von Argumenten verwenden statt:

command_null = ['rpcclient', '-N', '-U', '', str(target)] 

Ihr Problem zu beheben Sie haben zwei Möglichkeiten:

  • Geben Sie einen Befehl aus, der bei erfolgreicher Verbindung ausgeführt werden soll:

    command_null = ['rpcclient', '-N', '-U', '', '-c', 'exit', str(target)] 
    
  • Verwendung stdin=PIPE beim Öffnen des Prozesses, der rcpclient verlassen verursacht, wenn stdin von communicate() geschlossen ist:

    process_null = subprocess.Popen(command_null, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, stdin=subprocess.PIPE) 
    
+0

Entschuldigung für die Verzögerung, auch wenn Ihre Antwort auf die Frage im behebt, die es erklären tut, warum nicht nach 3 Ausführungen, aber funktioniert für die vorherigen 2. Nochmals vielen Dank für die Eingabe – iNoob

+1

Es schafft keine Verbindung für die ersten beiden Server, dann gelingt es, eine Verbindung mit der dritten, und nur in diesem Fall versucht, Befehle von stdin nach einem erfolgreichen zu lesen Anmeldung. Aus diesem Grund sehen Sie zwei Mal "verweigert" und dann hängt es, wenn eine Verbindung hergestellt werden kann, die Probleme verursacht. – mata

Verwandte Themen