所以我有我在 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 行運行,并且可能只有在最后一行之后,它才會拋出停止程式的錯誤。
知道為什么會這樣嗎?
uj5u.com熱心網友回復:
從評論中可以清楚地看出 - 問題在于getmac.get_mac_address()回傳的主機/本地IP None。我也在 Linux 上確認了這一點。看看這個問題——它是包的已知錯誤/限制——它不適用于 Linux 上的主機 ip。查看討論以獲取更多資訊。不過,您可以使用本地介面名稱。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/393399.html
