python-ldap 无法在开放服务器上执行任何基本搜索查询
python-ldap unable to do any basic search queries on open server
我一直在尝试进行一些基本的搜索查询,但无论如何我都无法连接到打开的 LDAP 服务器。我尝试了几台服务器,其中 none 成功了。我使用 Apache Directory Studio 来确保关键字在那里,但无论哪种方式都不起作用。我尝试了来自不同来源的各种不同代码。
这是我用的第一个
:
https://www.linuxjournal.com/article/6988
import ldap
keyword = "boyle"
def main():
server = "ldap.forumsys.com"
username = "cn=read-only-admin,dc=example,dc=com"
password = "password"
try:
l = ldap.open(server)
l.simple_bind_s(username,password)
print "Bound to server . . . "
l.protocol_version = ldap.VERSION3
print "Searching . . ."
mysearch (l,keyword)
except ldap.LDAPError:
print "Couldnt connect"
def mysearch(l, keyword):
base = ""
scope = ldap.SCOPE_SUBTREE
filter = "cn=" + "*" + keyword + "*"
retrieve_attributes = None
count = 0
result_set = []
timeout = 0
try:
result_id = l.search(base, scope, filter, retrieve_attributes)
while l != 1:
result_id = l.search(base, scope,filter, retrieve_attributes)
result_type, result_data = l.result(result_id, timeout)
if result_data == []:
break
else:
if result_type == ldap.RES_SEARCH_ENTRY:
result_set.append(result_data)
if len (result_set = 0):
print "No Results"
for i in range (len(result_set)):
for entry in result_set[i]:
try:
name = entry[1]['cn'][0]
mail = entry[1]['mail'][0]
#phone = entry[1]['telephonenumber'][0]
#desc = entry[1]['description'][0]
count = count + 1
print name + mail
except:
pass
except ldap.LDAPError, error_message:
print error_message
main()
每次我运行这个程序,我都会收到一个错误
{'desc': 你"No such object"}
我也试过这个
import ldap
try:
l = ldap.open("ldap.example.com")
except ldap.LDAPError, e:
print e
base_dn = "cn=read-only-admin,dc=example,dc=com"
search_scope = ldap.SCOPE_SUBTREE
retrieve_attributes = None
search_filter = "uid=myuid"
try:
l_search = l.search(base_dn, search_scope, search_filter, retrieve_attributes)
result_status, result_data = l.result(l_search, 0)
print result_data
except ldap.LDAPError, e:
print e
这个错误是
{'desc': 你"Can't contact LDAP server"}
我花了大约 5 个小时来解决这个问题。如果你们能给我一些建议,我将不胜感激。谢谢
里面有几件假货。
我只会评论你的第一个代码示例,因为任何人都可以使用它 public LDAP server。
l = ldap.open(server)
函数 ldap.open() 已弃用多年。您应该使用带有 LDAP URI 作为参数的函数 ldap.initialize(),而不是像这样:
l = ldap.initialize("ldap://ldap.forumsys.com")
l_search = l.search(..)
这是异步方法,它只是 returns 底层 OpenLDAP C API (libldap) 的消息 ID (int)。如果您想要检索 LDAP 服务器返回的扩展控件以及搜索结果,则需要它。那是你想要的吗?
作为初学者,您可能想使用更简单的方法 LDAPObject.search_s(),它立即 returns (DN, entry) 二元组的列表。
另请参阅:python-ldap -- Sending LDAP requests
while l != 1
这根本没有意义,因为 l 是您的 LDAPObject 实例(LDAP 连接对象)。请注意,如果 LDAPObject.search() 从 OpenLDAP 的 libldap 获得整数错误代码,它会引发异常。无需在此级别进行 C 风格的错误检查。
filter = "cn=" + "" + keyword + ""
如果关键字可以任意输入这是一个容易出现LDAP injection attacks的问题。不要那样做。
要将任意输入添加到 LDAP 过滤器,请使用函数 ldap.filter.escape_filter_chars() 正确转义特殊字符。还要避免使用变量名称 filter,因为它是内置 Python 函数的名称,并应将过滤器正确地括在括号中。
更好的例子:
ldap_filter = "(cn=*%s*)" % (ldap.filter.escape_filter_chars(keyword))
base = ""
您必须使用的正确搜索条件是:
基础 = "dc=example,dc=com"
否则ldap.NO_SUCH_OBJECT被引发。
所以这是一个完整的例子:
import pprint
import ldap
from ldap.filter import escape_filter_chars
BINDDN = "cn=read-only-admin,dc=example,dc=com"
BINDPW = "password"
KEYWORD = "boyle"
ldap_conn = ldap.initialize("ldap://ldap.forumsys.com")
ldap_conn.simple_bind_s(BINDDN, BINDPW)
ldap_filter = "(cn=*%s*)" % (ldap.filter.escape_filter_chars(KEYWORD))
ldap_results = ldap_conn.search_s(
"dc=example,dc=com",
ldap.SCOPE_SUBTREE,
ldap_filter,
)
pprint.pprint(ldap_results)
我一直在尝试进行一些基本的搜索查询,但无论如何我都无法连接到打开的 LDAP 服务器。我尝试了几台服务器,其中 none 成功了。我使用 Apache Directory Studio 来确保关键字在那里,但无论哪种方式都不起作用。我尝试了来自不同来源的各种不同代码。 这是我用的第一个 : https://www.linuxjournal.com/article/6988
import ldap
keyword = "boyle"
def main():
server = "ldap.forumsys.com"
username = "cn=read-only-admin,dc=example,dc=com"
password = "password"
try:
l = ldap.open(server)
l.simple_bind_s(username,password)
print "Bound to server . . . "
l.protocol_version = ldap.VERSION3
print "Searching . . ."
mysearch (l,keyword)
except ldap.LDAPError:
print "Couldnt connect"
def mysearch(l, keyword):
base = ""
scope = ldap.SCOPE_SUBTREE
filter = "cn=" + "*" + keyword + "*"
retrieve_attributes = None
count = 0
result_set = []
timeout = 0
try:
result_id = l.search(base, scope, filter, retrieve_attributes)
while l != 1:
result_id = l.search(base, scope,filter, retrieve_attributes)
result_type, result_data = l.result(result_id, timeout)
if result_data == []:
break
else:
if result_type == ldap.RES_SEARCH_ENTRY:
result_set.append(result_data)
if len (result_set = 0):
print "No Results"
for i in range (len(result_set)):
for entry in result_set[i]:
try:
name = entry[1]['cn'][0]
mail = entry[1]['mail'][0]
#phone = entry[1]['telephonenumber'][0]
#desc = entry[1]['description'][0]
count = count + 1
print name + mail
except:
pass
except ldap.LDAPError, error_message:
print error_message
main()
每次我运行这个程序,我都会收到一个错误 {'desc': 你"No such object"}
我也试过这个
import ldap
try:
l = ldap.open("ldap.example.com")
except ldap.LDAPError, e:
print e
base_dn = "cn=read-only-admin,dc=example,dc=com"
search_scope = ldap.SCOPE_SUBTREE
retrieve_attributes = None
search_filter = "uid=myuid"
try:
l_search = l.search(base_dn, search_scope, search_filter, retrieve_attributes)
result_status, result_data = l.result(l_search, 0)
print result_data
except ldap.LDAPError, e:
print e
这个错误是 {'desc': 你"Can't contact LDAP server"}
我花了大约 5 个小时来解决这个问题。如果你们能给我一些建议,我将不胜感激。谢谢
里面有几件假货。
我只会评论你的第一个代码示例,因为任何人都可以使用它 public LDAP server。
l = ldap.open(server)
函数 ldap.open() 已弃用多年。您应该使用带有 LDAP URI 作为参数的函数 ldap.initialize(),而不是像这样:
l = ldap.initialize("ldap://ldap.forumsys.com")
l_search = l.search(..)
这是异步方法,它只是 returns 底层 OpenLDAP C API (libldap) 的消息 ID (int)。如果您想要检索 LDAP 服务器返回的扩展控件以及搜索结果,则需要它。那是你想要的吗?
作为初学者,您可能想使用更简单的方法 LDAPObject.search_s(),它立即 returns (DN, entry) 二元组的列表。
另请参阅:python-ldap -- Sending LDAP requests
while l != 1
这根本没有意义,因为 l 是您的 LDAPObject 实例(LDAP 连接对象)。请注意,如果 LDAPObject.search() 从 OpenLDAP 的 libldap 获得整数错误代码,它会引发异常。无需在此级别进行 C 风格的错误检查。
filter = "cn=" + "" + keyword + ""
如果关键字可以任意输入这是一个容易出现LDAP injection attacks的问题。不要那样做。
要将任意输入添加到 LDAP 过滤器,请使用函数 ldap.filter.escape_filter_chars() 正确转义特殊字符。还要避免使用变量名称 filter,因为它是内置 Python 函数的名称,并应将过滤器正确地括在括号中。
更好的例子:
ldap_filter = "(cn=*%s*)" % (ldap.filter.escape_filter_chars(keyword))
base = ""
您必须使用的正确搜索条件是:
基础 = "dc=example,dc=com"
否则ldap.NO_SUCH_OBJECT被引发。
所以这是一个完整的例子:
import pprint
import ldap
from ldap.filter import escape_filter_chars
BINDDN = "cn=read-only-admin,dc=example,dc=com"
BINDPW = "password"
KEYWORD = "boyle"
ldap_conn = ldap.initialize("ldap://ldap.forumsys.com")
ldap_conn.simple_bind_s(BINDDN, BINDPW)
ldap_filter = "(cn=*%s*)" % (ldap.filter.escape_filter_chars(KEYWORD))
ldap_results = ldap_conn.search_s(
"dc=example,dc=com",
ldap.SCOPE_SUBTREE,
ldap_filter,
)
pprint.pprint(ldap_results)