【发布时间】: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