二丫讲梵 二丫讲梵
首页
  • 最佳实践
  • 迎刃而解
  • Nginx
  • Php
  • Zabbix
  • AWS
  • Prometheus
  • Grafana
  • CentOS
  • Systemd
  • Docker
  • Rancher
  • Ansible
  • Ldap
  • Gitlab
  • GitHub
  • Etcd
  • Consul
  • RabbitMQ
  • Kafka
  • MySql
  • MongoDB
  • OpenVPN
  • KVM
  • VMware
  • Other
  • ELK
  • K8S
  • LLM
  • Nexus
  • Jenkins
  • 随写编年
  • 家人物语
  • 追忆青春
  • 父亲的朋友圈
  • 电影音乐
  • 效率工具
  • 博客相关
  • Shell
  • 前端实践
  • Vue学习笔记
  • Golang学习笔记
  • Golang编程技巧
  • 学习周刊
  • Obsidian插件周刊
关于
友链
  • 本站索引

    • 分类
    • 标签
    • 归档
  • 本站页面

    • 导航
    • 打赏
  • 我的工具

    • 备忘录清单 (opens new window)
    • json2go (opens new window)
    • gopher (opens new window)
    • 微信MD编辑 (opens new window)
    • 国内镜像 (opens new window)
    • 出口IP查询 (opens new window)
    • 代码高亮工具 (opens new window)
  • 外站页面

    • 开往 (opens new window)
    • ldapdoc (opens new window)
    • HowToStartOpenSource (opens new window)
    • vdoing-template (opens new window)
GitHub (opens new window)

二丫讲梵

行者常至,为者常成
首页
  • 最佳实践
  • 迎刃而解
  • Nginx
  • Php
  • Zabbix
  • AWS
  • Prometheus
  • Grafana
  • CentOS
  • Systemd
  • Docker
  • Rancher
  • Ansible
  • Ldap
  • Gitlab
  • GitHub
  • Etcd
  • Consul
  • RabbitMQ
  • Kafka
  • MySql
  • MongoDB
  • OpenVPN
  • KVM
  • VMware
  • Other
  • ELK
  • K8S
  • LLM
  • Nexus
  • Jenkins
  • 随写编年
  • 家人物语
  • 追忆青春
  • 父亲的朋友圈
  • 电影音乐
  • 效率工具
  • 博客相关
  • Shell
  • 前端实践
  • Vue学习笔记
  • Golang学习笔记
  • Golang编程技巧
  • 学习周刊
  • Obsidian插件周刊
关于
友链
  • 本站索引

    • 分类
    • 标签
    • 归档
  • 本站页面

    • 导航
    • 打赏
  • 我的工具

    • 备忘录清单 (opens new window)
    • json2go (opens new window)
    • gopher (opens new window)
    • 微信MD编辑 (opens new window)
    • 国内镜像 (opens new window)
    • 出口IP查询 (opens new window)
    • 代码高亮工具 (opens new window)
  • 外站页面

    • 开往 (opens new window)
    • ldapdoc (opens new window)
    • HowToStartOpenSource (opens new window)
    • vdoing-template (opens new window)
GitHub (opens new window)
  • 最佳实践

  • 迎刃而解

  • Nginx

  • Php

  • Zabbix

  • AWS

  • Prometheus

  • Grafana

  • Loki

  • CentOS

  • Supervisord

  • Systemd

  • Docker

  • Docker-Compose

  • Rancher

  • Ansible

  • OpenLdap

    • ldap服务端快速部署
    • web部署和用户管理思路以及密码自助修改
    • 集成Zabbix,Jenkins,GitLab,JumpServer,Harbor,Nginx实战
    • 通过命令行管理用户分组备份等工作
    • ldap常见错误码
    • docker-compose部署openldap时初始化数据的两种方式
    • openLDAP入门系列笔记第一篇--捋透openLDAP的基础概念
    • openLDAP入门系列笔记第二篇--简单认识objectCLass以及常见应用
    • openLDAP入门系列笔记第三篇--ldapsearch查询语法整理入门
      • 简单搜索
      • 使用过滤器搜索
        • 查找目录树中的所有对象
        • 缩小查询范围
      • 添加运算符
        • 逻辑与
        • 逻辑或
        • 逻辑非
        • 通配符
        • 其他
      • 命令参数
  • GitLab

  • GitHub

  • Etcd

  • Consul

  • RabbitMQ

  • Kafka

  • Mysql

  • MongoDB

  • OpenVPN

  • Kvm

  • VMware

  • 配置文件详解

  • Other

  • 运维观止
  • OpenLdap
二丫讲梵
2023-02-20
目录

openLDAP入门系列笔记第三篇--ldapsearch查询语法整理入门

文章发布较早,内容可能过时,阅读注意甄别。

有人可能会觉得,有了 go-ldap-admin 这个平台之后,就不需要再了解这些查询方面的知识了,其实这是一个误区,go-ldap-admin 平台的确接管了 ldap 的一应管理,但是 ldap 终究还是要对接到第三方应用,这个时候,掌握一点简单的查询语法,就是很有必要的。

一般情况下,命令行中我们使用ldapsearch (opens new window)来进行搜索。

# 简单搜索

一般情况下,你可以直接运行如下命令执行搜索:

$ ldapsearch -x -b <search_base> -H <ldap_host> -D <bind_dn> -W
1
  • -x:表示简单的身份认证。
  • -b:指定搜索的 DC。
  • -H:指定搜索的主机 URL,如果你是在 LDAP 服务器上,则不需要带这个参数。比如我这里为 ldap://192.168.31.76:389
  • -D:绑定的 DN。
  • -W:绑定的 DN 的密码。

go-ldap-admin 初始化之后的数据,通过如下命令可以查询到:

$ ldapsearch -x -b "dc=eryajf,dc=net" -H ldap://192.168.31.76:389 -D "cn=admin,dc=eryajf,dc=net"  -W


# eryajf.net
dn: dc=eryajf,dc=net
objectClass: top
objectClass: dcObject
objectClass: organization
o: eryajf.net
dc: eryajf

# admin, eryajf.net
dn: cn=admin,dc=eryajf,dc=net
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword:: e1NTSEF9SXg2Zms0UnBLVVl4Y1JaVFZrZFNZN0tiVkZ1OGRYckQ=

# people, eryajf.net
dn: ou=people,dc=eryajf,dc=net
ou: people
description:: 55So5oi35qC555uu5b2V
objectClass: organizationalUnit

# dingtalkroot, eryajf.net
dn: ou=dingtalkroot,dc=eryajf,dc=net
ou: dingtalkroot
description:: 6ZKJ6ZKJ5qC56YOo6Zeo
objectClass: top
objectClass: organizationalUnit

# wecomroot, eryajf.net
dn: ou=wecomroot,dc=eryajf,dc=net
ou: wecomroot
description:: 5LyB5Lia5b6u5L+h5qC56YOo6Zeo
objectClass: top
objectClass: organizationalUnit

# feishuroot, eryajf.net
dn: ou=feishuroot,dc=eryajf,dc=net
ou: feishuroot
description:: 6aOe5Lmm5qC56YOo6Zeo
objectClass: top
objectClass: organizationalUnit

# search result
search: 2
result: 0 Success

# numResponses: 7
# numEntries: 6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52

# 使用过滤器搜索

我们可以通过在搜索命令末尾添加过滤条件,来实现符合条件的搜索。

$ ldapsearch <previous_options> "(object_type)=(object_value)" <optional_attributes>
1

其中的条件可以添加多个,并且支持一定的逻辑运算符,接下来一一介绍。

# 查找目录树中的所有对象

通过添加 "objectclass=*"的条件,我们可以检索到所有的对象信息:

$ ldapsearch -x -b "dc=eryajf,dc=net" -H ldap://192.168.31.76:389 -D "cn=admin,dc=eryajf,dc=net"  -W "objectclass=*"
1

执行结果与上边默认的一致。

# 缩小查询范围

比如上边有四个 ou 对应用户,钉钉,飞书,企业微信的组织,我们可以通过如下条件,将这四个组织过滤出来:

$ ldapsearch -x -b "dc=eryajf,dc=net" -H ldap://192.168.31.76:389 -D "cn=admin,dc=eryajf,dc=net"  -W "objectclass=organizationalUnit"

# people, eryajf.net
dn: ou=people,dc=eryajf,dc=net
ou: people
description:: 55So5oi35qC555uu5b2V
objectClass: organizationalUnit

# dingtalkroot, eryajf.net
dn: ou=dingtalkroot,dc=eryajf,dc=net
ou: dingtalkroot
description:: 6ZKJ6ZKJ5qC56YOo6Zeo
objectClass: top
objectClass: organizationalUnit

# wecomroot, eryajf.net
dn: ou=wecomroot,dc=eryajf,dc=net
ou: wecomroot
description:: 5LyB5Lia5b6u5L+h5qC56YOo6Zeo
objectClass: top
objectClass: organizationalUnit

# feishuroot, eryajf.net
dn: ou=feishuroot,dc=eryajf,dc=net
ou: feishuroot
description:: 6aOe5Lmm5qC56YOo6Zeo
objectClass: top
objectClass: organizationalUnit

# search result
search: 2
result: 0 Success

# numResponses: 5
# numEntries: 4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

在过滤条件的后边,我们可以指定关心的属性进行查询:

$ ldapsearch -x -b "dc=eryajf,dc=net" -H ldap://192.168.31.76:389 -D "cn=admin,dc=eryajf,dc=net"  -W "objectclass=organizationalUnit" dn ou

# people, eryajf.net
dn: ou=people,dc=eryajf,dc=net
ou: people

# dingtalkroot, eryajf.net
dn: ou=dingtalkroot,dc=eryajf,dc=net
ou: dingtalkroot

# wecomroot, eryajf.net
dn: ou=wecomroot,dc=eryajf,dc=net
ou: wecomroot

# feishuroot, eryajf.net
dn: ou=feishuroot,dc=eryajf,dc=net
ou: feishuroot

# search result
search: 2
result: 0 Success

# numResponses: 5
# numEntries: 4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

# 添加运算符

# 逻辑与

ldapsearch 使用&来表示逻辑与的运算,它的查询语法格式如下:

$ ldapsearch <previous_options> "(&(<条件_1>)(<条件_2>)...)"
1

注意上边的查询语法格式不要弄错。

比如,我们可以通过如下两个条件,来定位到 feishu(只是为了展示语法,不必纠结场景用法):

$ ldapsearch -x -b "dc=eryajf,dc=net" -H ldap://192.168.31.76:389 -D "cn=admin,dc=eryajf,dc=net"  -W "(&(objectclass=organizationalUnit)(ou=feishu))"
Enter LDAP Password:

# feishuroot, eryajf.net
dn: ou=feishuroot,dc=eryajf,dc=net
ou: feishu
ou: feishuroot
description:: 6aOe5Lmm5qC56YOo6Zeo
objectClass: top
objectClass: organizationalUnit

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 逻辑或

ldapsearch 使用|来表示逻辑或的运算,它的查询语法格式如下:

$ ldapsearch <previous_options> "(|(<条件_1>)(<条件_2>)...)"
1

比如,我们可以通过如下两个条件,来查询出飞书与钉钉的信息:

$ ldapsearch -x -b "dc=eryajf,dc=net" -H ldap://192.168.31.76:389 -D "cn=admin,dc=eryajf,dc=net"  -W "(|(ou=dingtalkroot)(ou=feishuroot))"
Enter LDAP Password:


# dingtalkroot, eryajf.net
dn: ou=dingtalkroot,dc=eryajf,dc=net
ou: dingtalkroot
description:: 6ZKJ6ZKJ5qC56YOo6Zeo
objectClass: top
objectClass: organizationalUnit

# feishuroot, eryajf.net
dn: ou=feishuroot,dc=eryajf,dc=net
ou: feishu
ou: feishuroot
description:: 6aOe5Lmm5qC56YOo6Zeo
objectClass: top
objectClass: organizationalUnit

# search result
search: 2
result: 0 Success

# numResponses: 3
# numEntries: 2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

# 逻辑非

ldapsearch 使用!来表示逻辑非的运算,他的查询语法格式如下:

$ ldapsearch <previous_options> "(!(<条件_1>))"
1

比如,查询 ou 不是钉钉的方法如下:

$ ldapsearch -x -b "dc=eryajf,dc=net" -H ldap://192.168.31.76:389 -D "cn=admin,dc=eryajf,dc=net"  -W "(!(ou=dingtalkroot))"
1

注意逻辑非不能直接多条件,如果想要多个条件,那么需要与其他逻辑进行嵌套使用,比如查询 ou 不是钉钉或者飞书,则可以用如下条件:

$ ldapsearch -x -b "dc=eryajf,dc=net" -H ldap://192.168.31.76:389 -D "cn=admin,dc=eryajf,dc=net"  -W "(!(|(ou=dingtalkroot)(ou=feishuroot)))"
1

注意如上嵌套的格式,那么更复杂的条件,就可以在此基础上进行扩展应用。

# 通配符

ldap 的搜索中也可以使用通配符,常用的是*,搜索语法如下:

$ ldapsearch <previous_options> "(object_type)=*(object_value)"

$ ldapsearch <previous_options> "(object_type)=(object_value)*"
1
2
3

比如,我们可以搜索 ou 以 root 结尾的内容:

$ ldapsearch -x -b "dc=eryajf,dc=net" -H ldap://192.168.31.76:389 -D "cn=admin,dc=eryajf,dc=net"  -W "ou=*root"

# dingtalkroot, eryajf.net
dn: ou=dingtalkroot,dc=eryajf,dc=net
ou: dingtalkroot
description:: 6ZKJ6ZKJ5qC56YOo6Zeo
objectClass: top
objectClass: organizationalUnit

# wecomroot, eryajf.net
dn: ou=wecomroot,dc=eryajf,dc=net
ou: wecomroot
description:: 5LyB5Lia5b6u5L+h5qC56YOo6Zeo
objectClass: top
objectClass: organizationalUnit

# feishuroot, eryajf.net
dn: ou=feishuroot,dc=eryajf,dc=net
ou: feishu
ou: feishuroot
description:: 6aOe5Lmm5qC56YOo6Zeo
objectClass: top
objectClass: organizationalUnit

# search result
search: 2
result: 0 Success

# numResponses: 4
# numEntries: 3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

# 其他

ldapsearch 还支持其他一些逻辑运算符,比如:

  • >=:查找特定项,该项中包含的属性的数字或字母值大于或等于指定的值。
  • <=:查找特定项,该项中包含的属性的数字或字母值小于或等于指定的值。
  • ~=:查找特定项,该项中所含属性的值约等于指定的值。

# 命令参数

ldapsearch 还有丰富的命令参数,罗列如下:

参数
用途
-a deref指定别名反向引用。请输入 never、always、search 或 find。如果不使用此参数,缺省为 never。
-A只检索属性的名称,而不检索属性的值。
-b base dn指定用作搜索起始点的专有名称。使用引号来指定该值,如:"ou=Ops,dc=shuyun,dc=com". 如果要搜索的服务器需要指定搜索起点,则必须使用此参数。否则此参数是可选的。也可以同时使用 -b 和 -s 来确定搜索范围。没有 –s,-b 就会搜索指定为起始点的项以及该项的所有子项。
-B允许打印非 ASCII 值
-D bind dn指定服务器用于验证您的专有名称。名称必须与目录中的项相符,并且必须拥有搜索目录所需的权限。请使用引号来指定该名称,例如:"cn=Manager,dc=shuyun,dc=com"。如果不使用此参数,则与服务器的连接是匿名的。如果服务器不允许匿名连接,则必须使用 -D。除了 -D,还必须使用 -w 参数来指定与专有名称相关联的口令。
-f file指定包含要使用的搜索过滤器的文件,如 -f 过滤器。请将每个搜索过滤器置于单独的一行。Ldapsearch 会对每一行执行一次搜索。可选择指定过滤模式。例如,指定 -f 过滤 "cn=%s",并在文件的每一行中输入公用名称的值。
-F sep在属性名称和值之间打印 sep 而不是等号 (=)。例如,如果读取 ldapsearch 输出的工具希望使用其他的分隔符时,可以使用此参数。
-h host name指定要连接的服务器主机名,如 -h ldap.shuyun.com。
-l timelimit指定完成搜索的时间限制(秒)。如果没有指定此参数或指定的限制为 0,那么搜索就没有时间限制。但是,ldapsearch 的等待时间决不会超过服务器上设置的搜索时间限制。
-L指定以 LDIF 格式输出。LDIF 格式使用冒号 (:) 而不是等号 (=) 作为属性描述符。LDIF 对一次性添加或修改大量目录项很有帮助。例如,可以将输出内容引入兼容 LDAP 的目录中。
-M将参考对象作为普通项进行管理,以使 ldapsearch 可返回参考项本身的属性,而不是所参考的项的属性。
-n显示如何执行搜索,但不实际执行搜索
-p port指定服务器使用的端口。如果没有使用此参数,缺省情况下 ldapsearch 使用 389 端口。
-R不自动遵循服务器返回的搜索引用。请注意,Netscape 目录服务器将术语 referrals 用于搜索引用。
-s scope指定使用 -b 参数时的搜索范围:

base -- 仅搜索 -b 参数指定的项

onelevel -- 仅搜索 -b 参数指定项的直接子项,而不搜索该项本身

subtree -- 搜索 -b 参数指定的项以及它的所有子项。这是不带 -s 时使用 -b 的缺省行为。

指定 -b 和 -s 的顺序并不重要。

-S attribute按指定的属性排序结果。
-z sizelimit指定返回项的最大数目。如果没有指定此参数或指定的限制为 0,那么返回的项没有数量限制。但是,ldapsearch 返回的项决不会多于服务器允许的数量。
-u指定 ldapsearch 以用户友好格式返回专有名称。
-v指定 ldapsearch 以详尽模式运行。
-w password指定与 -D 参数一起使用的与专有名称关联的口令。
x与 -S 一起使用时可指定 LDAP 服务器在将结果返回之前就对它们进行排序。如果使用 -S 而不使用 –x,ldapsearch 将对结果排序。
微信 支付宝
上次更新: 2024/09/26, 21:41:44
openLDAP入门系列笔记第二篇--简单认识objectCLass以及常见应用
Gitlab简单部署

← openLDAP入门系列笔记第二篇--简单认识objectCLass以及常见应用 Gitlab简单部署→

最近更新
01
学习周刊-总第209期-2025年第18周
05-03
02
学习周刊-总第208期-2025年第17周
04-24
03
Go开发实践之Gin框架将前端的dist目录embed到二进制
04-22
更多文章>
Theme by Vdoing | Copyright © 2017-2025 | 点击查看十年之约 | 浙ICP备18057030号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式