问题描述
这是我的代码,用于在虚拟环境中使用python3在LDAP中添加用户,但出现此错误
(“'Tuple_to_LDAPMod():列表中应为字节字符串,'inetorgPerson')“
import ldap
con = ldap.initialize('ldap://127.0.0.1')
ldap_base = "dc=example,dc=com"
dn = "uid=hasnain,ou=Users,dc=example,dc=com"
modlist = {
"objectClass": ["inetorgPerson","posixAccount","shadowAccount"],"uid": ["hasnain"],"sn": ["Hasnain"],"givenname": ["Muhammad"],"mail": ["hasnain@example.com"],"cn": ["Muhammad Hasnain"],"displayName": ["Muhammad Hasnain"],"gecos": ["Muhammad Hasnain"],"uidNumber": ["10001"],"gidNumber": ["5001"],"loginShell": ["/bin/bash"],"homeDirectory": ["/home/hasnain"]
}
result = con.add_s(dn,ldap.modlist.addModlist(modlist))
请您帮我解决这个问题
解决方法
错误消息中的答案就在那里:您需要使用字节字符串。
在Python3中创建字节字符串的两种方法是:
1:从头开始创建一个字符串作为字节字符串
example_bytestring = b"Foo Bar"
2:对现有字符串进行编码以获得字节字符串
example_bytestring = some_string.encode("utf-8")
所以就您而言:
modlist = {
"objectClass": [b"inetOrgPerson",b"posixAccount",b"shadowAccount"],"uid": [b"hasnain"],"sn": [b"Hasnain"],"givenName": [b"Muhammad"],"mail": [b"hasnain@example.com"],"cn": [b"Muhammad Hasnain"],"displayName": [b"Muhammad Hasnain"],"gecos": [b"Muhammad Hasnain"],"uidNumber": [b"10001"],"gidNumber": [b"5001"],"loginShell": [b"/bin/bash"],"homeDirectory": [b"/home/hasnain"]
}
或将其放在您的modlist之后,以将所有v编码为utf-8中的v:
modlist = {key:[v.encode("utf-8") for v in values] for key,values in modlist.items()}
但是,如果其中一个值已经是字节字符串,则此操作将失败。如果您想照顾自己,请使用:
modlist = {key:[v.encode("utf-8") if type(v) == str else v for v in values] for key,values in modlist.items()}
更多详细信息
Python使用unicode字符串表示形式。 LDAP需要字节字符串,这意味着您要么需要从一开始就将字符串定义为字节字符串,要么需要在使用它们之前进行转换。
如您所见,标准字符串的类型为str
:
>>type("foo")
str
虽然字节字符串的类型为bytes
:
>>type(b"foo")
bytes