Python3.4 -Nmap 需要root权限
Python3.4 -Nmap Requires root privileges
运行 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 的脚本有什么建议吗?
运行以 root 用户身份进行 IDLE 可能可行,但这可能不是一个好主意。 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
方案二(完全不推荐):
使用子进程 运行 具有提升代码的文件作为 root 和 return 输出。它变得有点混乱,需要您对密码进行硬编码...但这是可能的。
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,而不将其保存到文件并单独 运行ning。我建议您选择选项 1,因为选项 2 不是很好(但弄清楚它很有趣)。
复制空闲的桌面快捷方式并将其命名为rootidle,然后右键并更改属性。转到桌面条目并在 /usr/bin/idle3 之前添加 gksu。然后加载 运行 程序
运行 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 的脚本有什么建议吗?
运行以 root 用户身份进行 IDLE 可能可行,但这可能不是一个好主意。 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
方案二(完全不推荐):
使用子进程 运行 具有提升代码的文件作为 root 和 return 输出。它变得有点混乱,需要您对密码进行硬编码...但这是可能的。
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,而不将其保存到文件并单独 运行ning。我建议您选择选项 1,因为选项 2 不是很好(但弄清楚它很有趣)。
复制空闲的桌面快捷方式并将其命名为rootidle,然后右键并更改属性。转到桌面条目并在 /usr/bin/idle3 之前添加 gksu。然后加载 运行 程序