如果之前已经提出过这个问题我很抱歉,但是我无法找到这个问题的任何记录。完全披露:我只用了几个月的Python和MySQL大约一个月。
我在Raspberry Pi(运行Raspbian Wheezy)上编写了一个简短的Python脚本,它会嗅探wifi数据包并将信号强度信息写入MySQL数据库。我还创建了一个小的PHP文件,它从数据库中获取信息并将其显示在表格中(非常基本)。这个小系统的所有组件都按照计划完成,但是......
当我在后台运行Python脚本(sudo python my_script.py&)时,似乎没有用新读数更新MySQL数据库。然而它也没有出现任何错误和输出到控制台没有问题(每次拦截wifi数据包并将其RSSI添加到数据库时,我都会打印一行)。我在使用/etc/rc.local文件启动时启动脚本时遇到了同样的问题。没有错误,但数据库中也没有更新。
Python方面的问题是什么?我需要更改的MySQL设置?还有别的东西我完全不见了吗?
编辑添加代码:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import MySQLdb as mdb
import sys
from scapy.all import *
# Create connection to MySQL database called 'DATABASE' at localhost with username 'USERNAME' and password 'PASSWORD'
HOST = "localhost"
USER = "USERNAME"
PW = "PASSWORD"
DB = "DATABASE"
con = mdb.connect(HOST, USER, PW, DB)
# set interface that will be used to monitor wifi
interface = "mon0"
with con:
cur = con.cursor()
# This function will be called every time a packet is intercepted. Packet is passed to function as 'p'
def sniffmgmt(p):
# These are the 3 types of management frames that are sent exclusively by clients (allows us to weed out packets sent by APs)
stamgmtstypes = (0, 2, 4)
if p.haslayer(Dot11):
# Make sure packet is a client-only type
if p.subtype in stamgmtstypes:
# Calculate RSSI
sig_str = -(256-(ord(p.notdecoded[-4:-3])))
# Update database with most recent detection
cur.execute("REPLACE INTO attendance(mac_address, rssi, timestamp) VALUES('%s', %d, NOW())" % (p.addr2, sig_str))
# Print MAC address that was detected (debugging only)
print "MAC Address (%s) has been logged" % (p.addr2)
# Tell scapy what interface to use (see above) and which function to call when a packet is intercepted. lfilter limits packets to management frames.
sniff(iface=interface, prn=sniffmgmt, store=0, lfilter=lambda x:x.type==0)
谢谢! 凯尔
P.S。对于那些想知道的人:这不是用于恶意使用,它被用于调查我们仓库的产品跟踪技术。
答案 0 :(得分:2)
我希望你不要在db事务上调用commit
。