2015-08-26 2 views
0

Fonctionnant sur Mac Os 10.10.5 exécution de ce script pour rechercher les hôtes sur le réseau:Python3.4 -Nmap nécessite des privilèges root

import nmap 
nm = nmap.PortScanner() 
nm.scan('192.168.5.1/24', arguments='-O') 
for h in nm.all_hosts(): 
    if 'mac' in nm[h]['addresses']: 
     print(nm[h]['addresses'], nm[h]['vendor']) 

Lors de l'exécution, il l'impression:

Traceback (most recent call last): 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/nmap/nmap.py", line 290, in analyse_nmap_xml_scan 
    dom = ET.fromstring(self._nmap_last_output) 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/xml/etree/ElementTree.py", line 1326, in XML 
    return parser.close() 
    File "<string>", line None 
xml.etree.ElementTree.ParseError: no element found: line 1, column 0 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "/Users/*/Documents/*.py", line 3, in <module> 
    nm.scan('192.168.0.0/24', arguments='-O') 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/nmap/nmap.py", line 235, in scan 
    nmap_err_keep_trace = nmap_err_keep_trace) 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/nmap/nmap.py", line 293, in analyse_nmap_xml_scan 
    raise PortScannerError(nmap_err) 
nmap.nmap.PortScannerError: 'TCP/IP fingerprinting (for OS scan) requires root privileges.\nQUITTING!\n' 

J'ai essayé d'aller dans ce répertoire et d'exécuter cette commande dans le terminal: sudo python * .py

({'mac': '02:62:31:41:6D:84', 'ipv4': '192.168.5.1'}, {}) 

Des suggestions pour exécuter le script à partir de Python IDLE?

+0

Sur quel système d'exploitation êtes-vous? – IanAuld

+0

@IanAuld Mac OS 10.10.5 –

Répondre

0

L'exécution de IDLE en tant que root peut fonctionner, mais ce n'est peut-être pas une bonne idée. sudo idle

Option 1 (recommandé):

Insérez le code nécessitant des privilèges élevés dans un fichier python que vous exécutez avec sudo. Je suppose que vous voulez jouer avec les résultats, de sorte que vous pourriez avoir le script enregistrer les résultats dans un fichier, que vous lisez ensuite dans IDLE.

Le code suivant fonctionne en Python 2.7 et 3,4

import nmap 
import json 

nm = nmap.PortScanner() 
nm.scan('192.168.5.1/24',arguments='-O') #Note that I tested with -sP to save time 
output = [] 
with open('output.txt', 'a') as outfile: 
    for h in nm.all_hosts(): 
    if 'mac' in nm[h]['addresses']: 
     item = nm[h]['addresses'] 
     if nm[h]['vendor'].values(): 
     item['vendor'] = list(nm[h]['vendor'].values())[0] 
     output.append(item) 
    json.dump(output, outfile) 

Run sudo python nmaproot.py Depuis le fichier est écrit par root, vous devez changer la propriété au même. sudo chown -r myusername output.txt

En IDLE:

import json 
input = open('output.txt','r'): 
json_data = json.load(input) 
json_data[0] # first host 

Option 2 (non recommandée à tous):

Utilisez subprocess pour exécuter le fichier avec le code élevé en tant que root et retourner la sortie. Cela devient un peu compliqué et vous oblige à coder en dur votre mot de passe ... mais c'est possible.

from subprocess import Popen, PIPE 
cmd = ['sudo', '-S', 'python', 'nmaproot.py'] 
sudopass = 'mypassword' 
p = Popen(cmd, stdin=PIPE, stderr=PIPE,universal_newlines=True, stdout=PIPE) 
output = p.communicate(sudopass + '\n') 

Je ne suis pas sûr de la façon dont vous pouvez exécuter une partie donnée de votre code Python en tant que root sans l'enregistrer dans un fichier et l'exécuter séparément. Je vous recommande d'y aller avec l'option 1 car l'option 2 n'est pas très bonne (mais c'était amusant à comprendre).

+0

pouvez-vous élaborer sur la façon dont vous faites l'option un? Je ne suis pas sûr de ce que vous entendez par là et comment le faire –

+0

Mis à jour la réponse avec un code sur la façon dont vous pourriez faire l'option 1 – Duplexia

+0

Remarque, je ne veux pas avoir à le lancer sur le terminal .. Je voudrais faire être capable de l'exécuter sur l'IDLE si possible –

0

Copiez le raccourci du bureau inactif et nommez-le rootidle puis à droite et modifiez les propriétés. Aller à l'entrée de bureau et ajouter gksu avant/usr/bin/idle3. Ensuite, chargez et exécutez le programme