繁体   English   中英

Python 子进程nmap output 与终端命令不同

[英]Python subprocess nmap output different from terminal command

我正在尝试在 linux(shell 输出)中使用 nmap 命令的 output:

sudo nmap -sn 192.168.1.0/24
------
Nmap scan report for 192.168.1.98
Host is up (0.094s latency).
MAC Address: B8:27:EB:CE:0A:9F (Raspberry Pi Foundation)

在通过子进程的 python 脚本中:

import subprocess
p = subprocess.Popen(["nmap", "-sn", "192.168.1.0/24"], stdout=subprocess.PIPE)
output, err = p.communicate()
print ("*** Running nmap -sn 192.168.1.0/24 ***\n", output)

除了我需要 shell output 拥有的 MAC 线而 subprocess 不需要的事实之外,它的效果很好。

子进程 output:

\nNmap scan report for 192.168.1.98\nHost is up (0.015s latency).\n

我正在研究通过 MAC/名称获取 IP 的想法,如果没有那条线,我看不到该怎么做......

您不需要在 python 中将 nmap 作为子进程运行,您只需安装 nmap 库并导入即可。

pip install python-nmap

然后编写你的代码:

import json
import nmap

np = nmap.PortScanner()

target = '192.168.1.0/24'

# Scan the subnet 
results = np.scan(hosts=target, arguments='-sn')

# Clean the data nmap returns
results = results['scan']
output = {}
for result in results:
    output[result] = {}
    # Add the MAC addr to the IP
    try:
        output[result]['mac']       = results[result]['addresses']['mac']
    except:
        output[result]['mac']       = 'No MAC address avalible'
    # Add the vendor to the IP
    try:
        output[result]['vendor']    = list(results[result]['vendor'].values())[0]
    except:
        output[result]['vendor']    = 'No vendor info avalible'

print(json.dumps(output,indent=2))

当您运行代码时,您必须将其作为 sudo 运行,否则您将无法获得 MAC 地址。

Output 应该是这样的

{
  "192.168.1.1": {
    "mac": "16:91:82:xx:xx:xx",
    "vendor": "No vendor info avalible"
  },
  "192.168.1.10": {
    "mac": "44:39:C4:xx:xx:xx",
    "vendor": "Universal Global Scientific Industrial"
  },
  "192.168.1.50": {
    "mac": "No MAC address avalible",
    "vendor": "No vendor info avalible"
  }
}

我希望它有帮助:-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM