一般来说,我熟悉MySQL,但不熟悉Python。
我尝试生成.py脚本,该脚本将一个具有哈希密码的用户插入到radius服务器的mysql数据库中。
到目前为止这是我的剧本:
#!/usr/bin/python2.7
import sys
import MySQLdb
from passlib.hash import django_pbkdf2_sha256 as cryptohandler
def adduser(username, password_plain):
password = cryptohandler.encrypt(password_plain)
conn = MySQLdb.connect(host="localhost", port=3306, user="radius", passwd="radpass", db="radius")
cursor = conn.cursor()
if cursor.execute("SELECT op FROM radcheck WHERE username = %s", (username)):
print 'FEHLER: User existiert bereits und kann daher nicht angelegt werden.'
sys.exit(1)
else:
try:
cursor.execute("INSERT INTO radcheck(username, attribute, op, value) VALUES(%s, 'Password', ':=', %s)", (username, password))
conn.commit()
print 'OK user '+ username +' successfully added with hash'+ password
sys.exit(0)
except:
conn.rollback()
print 'FEHLER query failed'
sys.exit(1)
def main():
adduser(sys.argv[1], sys.argv[2])
main()
输出总是“费勒查询失败”,如果用户名存在,查找的第一个查询工作正常。
雷达检查表:
id int(11) unsigned Null=No Key=Pri Default=Null Extra=auto_increment
username varchar(64) Null=No Key=Mul
attribute varchar(64) Null=No
op char(2) Null=No Default="=="
value varchar(253) Null=No
在mysql命令行中执行查询可以正常工作。
我的剧本哪里出错了?
我想这可能是一个太长的散列,但散列只有<100个字符长。(但包含特殊字符,如美元$)。
另外,我也很感激如何调试python sql脚本的帮助!
最佳答案
这里的问题不是您的MySQL代码,而是这个try/except块:
try:
cursor.execute("INSERT INTO radcheck(username, attribute, op, value) VALUES(%s, 'Password', ':=', %s)", (username, password))
conn.commit()
print 'OK user '+ username +' successfully added with hash'+ password
sys.exit(0)
except:
conn.rollback()
print 'FEHLER query failed'
sys.exit(1)
当您调用
sys.exit(0)
时,它会引发一个名为SystemExit
的异常。由于bareexcept:
catch语句捕获SystemExit
,因此在调用sys.exit(0)
时将始终执行此块。要防止这种情况发生,请将except:
捕获更改为:except Exception as e:
conn.rollback()
print 'FEHLER query failed'
sys.exit(1)
更好的方法是只捕获MySQL错误:
except MySQLdb.Error as e:
conn.rollback()
print 'FEHLER query failed'
sys.exit(1)