【问题标题】:Python subprocess nmap output different from terminal commandPython子进程nmap输出不同于终端命令
【发布时间】:2020-07-09 14:41:24
【问题描述】:

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

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 输出具有的 MAC 行而 subprocess 不需要这一事实之外,这非常有效。

子进程输出:

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

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

【问题讨论】:

  • 您是否以 root 身份运行脚本?
  • 我不认为它正在写入标准错误。您是否尝试过使用 sudo 作为前缀?虽然,使用包是更好的方法。
  • 感谢@CMinusMinus!这解决了它....

标签: python subprocess output nmap


【解决方案1】:

在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 地址。

输出应该是这样的

{
  "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"
  }
}

希望对你有帮助:-)

【讨论】:

  • 谢谢@Mama。我在搞乱“python-nmap”版本,但它没有解决我的问题(或者我不知道如何解决它)。我用这个方法使用这个版本nmap = nmap3.NmapHostDiscovery() results = nmap.nmap_no_portscan("192.168.1.0/24") 输出有效,但它没有给我 MAC 地址或名称,只是 IP 和状态。
  • 这是输出:{'state': 'up', 'reason': 'conn-refused', 'reason_ttl': '0', 'addr': '192.168.1.98', 'addrtype': 'ipv4'} 我需要 MAC 和名称才能看到 IP 所有者...也许是关于 conn-refused?
  • 如果我以“sudo”身份运行我的脚本,我会收到此错误:[sudo] password for daniziz: Traceback (most recent call last): File "nmap_rb.py", line 2, in <module> import nmap ModuleNotFoundError: No module named 'nmap'
  • 好的,我已经使用sudo pip install python-nmap 完成了它,因为如果我不使用 sudo 权限安装它,我就无法使用 sudo 运行 .py 脚本。我打算使用 JSON 格式来获得我的供应商,但这比子流程选项更好。
  • 这是我的解决方案:for result in results: try: # View to list and append vendor = list(results[result]["vendor"].values())[0] vendors_check.append(vendor) except IndexError as E: print("Element scan error, not adding to list and continuing...")
猜你喜欢
  • 2021-12-10
  • 2014-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-09
  • 2013-09-06
  • 1970-01-01
  • 1970-01-01
  • 2019-05-04
相关资源
最近更新 更多