Python3 Tuple_to_LDAPMod:问题 1:从头开始创建一个字符串作为字节字符串 2:对现有字符串进行编码以获得字节字符串

问题描述

这是我的代码,用于在虚拟环境中使用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