【问题标题】:TypeError 仅在 Linux 上执行时出现,在 Windows 上运行良好
【发布时间】:2022-01-23 12:47:22
【问题描述】:

所以我有我在 windows 上创建的这个 python 文件:

import sqlite3
import getmac
import nmap

nm = nmap.PortScanner()
prevAmount = 0

while True:
    nm.scan(hosts='192.168.1.0/24', arguments='-n -sP -PE -PA21,23,80,3389')
    hosts_list = nm.all_hosts()
    hosts_list.remove('192.168.1.1')
    print(hosts_list)
    if len(hosts_list) > prevAmount:
        for host in hosts_list:
            mac = getmac.get_mac_address(ip=host)
            connection = sqlite3.connect('OpenSesame.db')
            cursor = connection.cursor()
            cursor.execute("SELECT EXISTS(SELECT 1 FROM tblDevices WHERE DeviceMAC ='" + mac + "');")
            bExists = cursor.fetchone()
            if bExists[0] == 1:
                cursor.execute("SELECT DeviceName FROM tblDevices WHERE DeviceMAC ='" + mac + "';")
                persoon = cursor.fetchone()
                print(persoon[0])
        prevAmount = len(hosts_list)
    elif len(hosts_list) < prevAmount:
        prevAmount = 0

我目前正试图在 Raspberry Pi 上实现它,显然是在运行 Linux。 我得到的完整输出是:

['192.168.1.17', '192.168.1.55', '192.168.1.56', '192.168.1.59', '192.168.1.70']
Traceback (most recent call last):
  File "RelayOpenSesame.py", line 19, in <module>
    cursor.execute("SELECT EXISTS(SELECT 1 FROM tblDevices WHERE DeviceMAC ='" + mac + "');")
TypeError: can only concatenate str (not "NoneType") to str

这只会发生在 Linux 上,不会发生在 Windows 上。 我还注意到,在将设备连接到实际上位于数据库中的网络时,它会打印出名称,这是在第 23 行完成的:print(persoon[0]) 因此,程序运行到导致错误的第 19 行,并且可能仅在最后一行之后它抛出错误并停止程序。

知道为什么会这样吗?

【问题讨论】:

  • 显然在某些时候 mac 是无。当你print(mac) 在你检索到它之后会发生什么?在您显示的输出中,仅打印了主机列表,然后出现错误。没有其他输出。
  • 根据the docs get_mac_address() 将返回 None 如果找不到或出现错误
  • 不要养成字符串连接 sql 参数的习惯 - 使用参数化查询! xkcd.com/327 - https://www.sqlskills.com/blogs/kimberly/little-bobby-tables-sql-injection-and-execute-as/
  • @buran 就是这样!我完全忘记了它会检索找到的每个 IP 的 mac 的事实。我太专注于我没有逻辑思考的错误。添加print(mac) 显示 get_mac_address() 适用于除树莓派的 IP(以 70 结尾)之外的每个 IP。如您所见,我删除了路由器 192.168.1.1,因此我也删除了有效的 192.168.1.70。现在我只想知道为什么会这样?树莓派应该有mac地址吧?
  • 请注意,文档说“本地接口或远程主机”。所以我包有一些限制 - 我没有详细介绍代码。尝试使用接口名称。

标签: python sql string sqlite networking


【解决方案1】:

从 cmets 中可以清楚地看出 - 问题在于 getmac.get_mac_address() 返回 None 的主机/本地 IP。我也在 Linux 上证实了这一点。 查看this issue - 已知包的错误/限制 - it does not work for host ip on Linux。检查讨论以获取更多信息。 您可以使用本地接口名称。

【讨论】:

    猜你喜欢
    • 2018-01-25
    • 2021-09-28
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 2020-04-02
    • 1970-01-01
    相关资源
    最近更新 更多