2021-03-24 15:36:08 发布
您现在位置:Python中文网/ 问答频道 /正文86651 3网友
男|程序猿一只,喜欢编程写python代码。我的上一个python项目已经有一段时间了,所以我有点生疏了--请随时提供任何建议或批评--所以我有一些关于eval和JSON的问题。在
对于这个项目,我仅限于Python2.6默认库——我试图解析用于LDAP身份验证的基于Linux的专有应用程序的数据库内容。用于查询数据库的特定命令并不十分重要,但我使用以下方法返回包含的输出:
process = subprocess.Popen([cmd], shell=True, stdout=subprocess.PIPE)stdout = process.communicate()[0]
输出:
^{pr2}$**我看到一篇帖子,指出shell=True可能有某些安全隐患,我想知道是否有更好的解决方案?
利用ast.literal_eval和{}我已经能够成功地解析单个密钥对,但是我觉得我的多级转换是不必要的,并且相信有更好的方法吗?在
def ldap_data(stdout): # evaluate object and return usable \'ldap_data\' as dictionary _data = ast.literal_eval(stdout)[0][\'ldap_data\'] return json.loads(_data)ldap_data(stdout)[\'roles\']
最后,当我开始这个项目时,我从来没有想过用户可能有多个ldap配置,这取决于各个部署需求,因此,我从未真正考虑过如何解析每个dictionary实例。考虑到这个解决方案遇到的路障数量,我希望有人能帮助设计一个利用上面输出的索引的解决方案。在
我很抱歉问了这么多,我相信我只是想得太多了,我期待着学习我可以做些什么来提高。提前感谢您的帮助!在
1条回答网友1楼 ·通常,当使用subprocess运行单个命令时,如果将命令名和每个选项设置为单独的字符串,则不需要shell=True,即
[\'cmd\', \'arg1\', \'arg2\']
您需要shell=True来执行shell内部的命令,或者使用其他shell功能,如the docs中所述,但这不是问题所在。在
对于解析该数据,您不需要来执行此操作,但您确实需要修改引号以使该数据成为有效的JSON。这可以通过转义现有的双引号,然后将单引号转换为双引号来完成。一旦修复的数据使用json.loads解析成Python列表,您需要再次调用json.loads来提取LDAP字典。在
^{pr2}$输出
{ \"bind_dn\": \"CN=Bind,OU=Users,DC=example,DC=com\", \"bind_pw\": \"xxxxxxxx\", \"ca_cert_file\": null, \"cache_expire\": 86400, \"roles\": [ \"admin:CN=SuperUsers,DC=example,DC=com\", \"read_only:CN=Users,DC=example,DC=com\" \"search_base\": \"OU=Users,DC=example,DC=com\", \"search_filter\": \"(sAMAccountName={username})\", \"server_url\": [ \"ldap://ad.example.com\", \"ldaps://ad.example.com:3001\" \"timeout\": 1500, \"user_to_dn_rule\": \"{username}@example.com\" \"bind_dn\": \"CN=Bind,OU=Users,DC=example,DC=com\", \"bind_pw\": \"xxxxxxxx\", \"ca_cert_file\": null, \"cache_expire\": 86400, \"roles\": [ \"admin:CN=SuperUsers,DC=example,DC=com\" \"search_base\": \"OU=Users,DC=example,DC=com\", \"search_filter\": \"(sAMAccountName={username})\", \"server_url\": [ \"ldap://169.254.0.1\" \"timeout\": 1500, \"user_to_dn_rule\": null
在Python2.6.6上测试
注意,ldap字典中的键(和值字符串)是Unicode字符串,而JSON转储中表示为null的值实际上是None。在
相关问题本文链接: http://evalca.immuno-online.com/view-723153.html