Python3.4 -Nmap Требуются привилегии root

Запуск в Mac Os 10.10.5 Запуск этого сценария для сканирования хостов в сети:

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'])

При запуске его печать:

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'

Я попытался перейти в этот каталог и запустить эту команду в терминале: sudo python *.py

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

Любые предложения по запуску скрипта из python IDLE?


person Bob Ebert    schedule 26.08.2015    source источник
comment
@IanAuld Mac OS 10.10.5   -  person Bob Ebert    schedule 26.08.2015


Ответы (2)


Запуск IDLE от имени пользователя root может сработать, но это не лучшая идея. sudo idle

Вариант 1 (рекомендуется):

Поместите код, требующий повышенных привилегий, в файл Python, который вы запускаете с помощью sudo. Я предполагаю, что вы хотите поиграть с результатами, чтобы сценарий мог сохранить результаты в файл, который вы затем прочитали в IDLE.

Следующий код работает в Python 2.7 и 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)

Запустите sudo python nmaproot.py Так как файл написан пользователем root, вам нужно снова сменить владельца на себя. sudo chown -r myusername output.txt

В режиме ожидания:

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

Вариант 2 (совсем не рекомендуется):

Используйте подпроцесс, чтобы запустить файл с повышенным кодом от имени пользователя root и вернуть результат. Это становится немного запутанным и требует, чтобы вы жестко закодировали свой пароль ... но это возможно.

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')

Я не уверен, как вы можете запустить данную часть вашего кода Python от имени пользователя root, не сохраняя его в файл и не запуская его отдельно. Я рекомендую вам выбрать вариант 1, так как вариант 2 не очень хорош (но было интересно разобраться).

person Duplexia    schedule 26.08.2015
comment
а можно поподробней как сделать первый вариант? Я не уверен, что вы имеете в виду под этим и как это сделать - person Bob Ebert; 26.08.2015
comment
Обновлен ответ с некоторым кодом о том, как вы можете сделать вариант 1. - person Duplexia; 26.08.2015
comment
Обратите внимание: я не хочу запускать его на терминале. Я хотел бы иметь возможность запускать его на IDLE, если это возможно. - person Bob Ebert; 27.08.2015
comment
Единственный вариант — запустить IDLE от имени root. sudo idle в терминале. Однако это плохая практика безопасности, поэтому делайте это на свой страх и риск. - person Duplexia; 27.08.2015
comment
Почему это риск, если я сканирую только с помощью nmap, не должно быть никаких рисков, верно? И поэтому мне пришлось бы запустить вариант 2: поместить этот код перед моим кодом и запустить его? (хотя я понимаю, что он делает...) - person Bob Ebert; 27.08.2015
comment
Если вы работаете в режиме ожидания как root, вы можете делать все в режиме ожидания без вариантов 1 или 2 (просто делайте то, что вы делали раньше). Это плохая практика безопасности, потому что весь код, который вы пишете, имеет привилегии root. Будьте осторожны с тем, что вы туда положили. Вы можете найти гораздо больше информации о том, почему запуск произвольного кода от имени пользователя root является плохой практикой в ​​Интернете. Нет проблем с запуском данного кода от имени пользователя root, но весь другой код, который вы пишете, также будет выполняться от имени пользователя root, в чем и заключается проблема. - person Duplexia; 27.08.2015
comment
Я приму ваш ответ через секунду, нормально ли, что в терминале я не могу запустить: sudo python myfile.py ... Сначала мне нужно перейти в каталог с помощью: cd mylocation? - person Bob Ebert; 27.08.2015
comment
Давайте продолжим обсуждение в чате. - person Duplexia; 27.08.2015

Скопируйте ярлык бездействия на рабочем столе и назовите его rootidle, затем вправо и измените свойства. Перейдите на рабочий стол и добавьте gksu перед /usr/bin/idle3. Затем загрузите и запустите программу

person Community    schedule 23.01.2016