ldap条目管理
ldap相关命令连接ldap不同方式说明
-H ldap://
与 -H ldapi:///
的对比说明
形式 | 协议类型 | 说明 | 用途场景 |
---|---|---|---|
-H ldap://localhost | TCP 明文协议 | 使用标准 TCP/IP 连接,默认端口是 389 | 本地或远程连接,适合大多数情况 |
-H ldapi:/// | UNIX 域套接字 | 使用本地 Unix Socket 文件(如 /var/run/ldapi ) | 本机内部通信,权限更精细更安全 |
-H ldap://localhost
- 使用标准 LDAP 协议,通过 TCP 端口(通常 是 389)。
- 可以连接到本机或远程服务器。
- 明文传输(不加密),如需加密应使用
ldaps://
或 StartTLS。 - 通常需要用户名/密码进行身份验证。
示例
ldapsearch -H ldap://localhost -D "cn=admin,dc=ops,dc=com" -w admin ...
-H ldapi:///
- 使用 本地 UNIX socket(LDAP over IPC)。
- 不需要走网络,连接速度更快、更安全。
- 可以使用本地用户凭据自动认证(如
EXTERNAL
机制)。 - 通常只允许
root
或ldap
用户访问 socket 文件。
示例(使用 EXTERNAL 本地认证)
ldapsearch -H ldapi:/// -Y EXTERNAL -b cn=config
附加说明 ldaps://
如果希望使用 加密的 TCP 连接,可以使用如下方式,这是使用 SSL 加密的 LDAP 连接,默认端口是 636
-H ldaps://localhost
组管理
创建组
创建单个组
cat > add-group.ldif <<EOF
dn: cn=java,dc=ops,dc=com
objectClass: top
objectClass: posixGroup
cn: java
gidNumber: 1000
EOF
字段说明
字段 | 含义 |
---|---|
dn: | 条目的完整识别名(Distinguished Name) |
cn: java | Common Name,是组的名称 |
gidnumber: 1000 | 这个组的 Linux GID(组 ID),应在系统中唯一 |
objectclass: posixGroup | 说明这是一个 POSIX 兼容的组 |
objectclass: top | 所有条目的基类,必须有 |
执行命令
可以使用 -W
选项采用命令行交互式输入密码,更安全
ldapadd -x \
-D "cn=admin,dc=ops,dc=com" \
-w admin \
-H ldap://localhost \
-f add-group.ldif
输出
adding new entry "cn=java,dc=ops,dc=com"
导入后查询
::tip 说明
"(cn=java)"
表示查询过滤器(查找 cn=java 的条目),不写默认查找所有
-b "cn=java,dc=ops,dc=com"
如果写成这样则表示精确查找
:::
ldapsearch -x \
-D "cn=admin,dc=ops,dc=com" \
-w admin \
-H ldap://localhost \
-b "dc=ops,dc=com" \
"(cn=java)"
输出
# extended LDIF
#
# LDAPv3
# base <dc=ops,dc=com> with scope subtree
# filter: (cn=java)
# requesting: ALL
#
# java, ops.com
dn: cn=java,dc=ops,dc=com
objectClass: top
objectClass: posixGroup
cn: java
gidNumber: 1000
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
在phpldapadmin中查看创建的组
创建多个组
cat > add-multiple-groups.ldif <<EOF
dn: cn=java,dc=ops,dc=com
objectClass: top
objectClass: posixGroup
cn: java
gidNumber: 1001
dn: cn=php,dc=ops,dc=com
objectClass: top
objectClass: posixGroup
cn: php
gidNumber: 1002
dn: cn=go,dc=ops,dc=com
objectClass: top
objectClass: posixGroup
cn: go
gidNumber: 1003
EOF
执行命令
ldapadd -x \
-D "cn=admin,dc=ops,dc=com" \
-w admin \
-H ldap://localhost \
-f add-multiple-groups.ldif
输出
adding new entry "cn=java,dc=ops,dc=com"
adding new entry "cn=php,dc=ops,dc=com"
adding new entry "cn=go,dc=ops,dc=com"
创建后查询
ldapsearch -x \
-D "cn=admin,dc=ops,dc=com" \
-w admin \
-H ldap://localhost \
-b "dc=ops,dc=com" \
"(objectClass=posixGroup)"
输出
# extended LDIF
#
# LDAPv3
# base <dc=ops,dc=com> with scope subtree
# filter: (objectClass=posixGroup)
# requesting: ALL
#
# java, ops.com
dn: cn=java,dc=ops,dc=com
objectClass: top
objectClass: posixGroup
cn: java
gidNumber: 1001
# php, ops.com
dn: cn=php,dc=ops,dc=com
objectClass: top
objectClass: posixGroup
cn: php
gidNumber: 1002
# go, ops.com
dn: cn=go,dc=ops,dc=com
objectClass: top
objectClass: posixGroup
cn: go
gidNumber: 1003
# search result
search: 2
result: 0 Success
# numResponses: 4
# numEntries: 3
查询组
查询整个目录下所有条目
ldapsearch -x \
-D "cn=admin,dc=ops,dc=com" \
-w admin \
-H ldap://localhost \
-b "dc=ops,dc=com" \
"(objectClass=*)"
输出
# extended LDIF
#
# LDAPv3
# base <dc=ops,dc=com> with scope subtree
# filter: (objectClass=*)
# requesting: ALL
#
# ops.com
dn: dc=ops,dc=com
o: ldap
objectClass: dcObject
objectClass: organization
dc: ops
# devops, ops.com
dn: ou=devops,dc=ops,dc=com
objectClass: organizationalUnit
ou: devops
# admin, devops, ops.com
dn: uid=admin,ou=devops,dc=ops,dc=com
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
uid: admin
cn: Administrator
sn: Admin
userPassword:: e1NTSEF9R2cyZitOdXlCc2RuVlhob2VBa3VQK3JDU0gyMzI1aUI=
# java, ops.com
dn: cn=java,dc=ops,dc=com
objectClass: top
objectClass: posixGroup
cn: java
gidNumber: 2000
# go, ops.com
dn: cn=go,dc=ops,dc=com
cn: go
gidNumber: 500
objectClass: posixGroup
objectClass: top
# php, ops.com
dn: cn=php,dc=ops,dc=com
cn: php
gidNumber: 501
objectClass: posixGroup
objectClass: top
# search result
search: 2
result: 0 Success
# numResponses: 7
# numEntries: 6
查询指定类型的组
查询 posixGroup
组
ldapsearch -x \
-D "cn=admin,dc=ops,dc=com" \
-w admin \
-H ldap://localhost \
-b "dc=ops,dc=com" \
"(objectClass=posixGroup)"
输出
# extended LDIF
#
# LDAPv3
# base <dc=ops,dc=com> with scope subtree
# filter: (objectClass=posixGroup)
# requesting: ALL
#
# java, ops.com
dn: cn=java,dc=ops,dc=com
objectClass: top
objectClass: posixGroup
cn: java
gidNumber: 2000
# go, ops.com
dn: cn=go,dc=ops,dc=com
cn: go
gidNumber: 500
objectClass: posixGroup
objectClass: top
# php, ops.com
dn: cn=php,dc=ops,dc=com
cn: php
gidNumber: 501
objectClass: posixGroup
objectClass: top
# search result
search: 2
result: 0 Success
# numResponses: 4
# numEntries: 3
查询指定类型组下的特定组
查询对象类是 posixGroup
并且组名(cn)是 go 的组
ldapsearch -x \
-D "cn=admin,dc=ops,dc=com" \
-w admin \
-H ldap://localhost \
-b "dc=ops,dc=com" \
"(&(objectClass=posixGroup)(cn=go))"
查询单个 cn
条目
ldapsearch -x \
-D "cn=admin,dc=ops,dc=com" \
-w admin \
-H ldap://localhost \
-b "cn=java,dc=ops,dc=com"
输 出
# extended LDIF
#
# LDAPv3
# base <cn=java,dc=ops,dc=com> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
# java, ops.com
dn: cn=java,dc=ops,dc=com
objectClass: top
objectClass: posixGroup
cn: java
gidNumber: 2000
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
查询多个 cn
条目
这里指定cn java
和 go
ldapsearch -x \
-D "cn=admin,dc=ops,dc=com" \
-w admin \
-H ldap://localhost \
-b "dc=ops,dc=com" \
"(| (cn=java)(cn=go) )"
输出
# extended LDIF
#
# LDAPv3
# base <dc=ops,dc=com> with scope subtree
# filter: (| (cn=java)(cn=go) )
# requesting: ALL
#
# java, ops.com
dn: cn=java,dc=ops,dc=com
objectClass: top
objectClass: posixGroup
cn: java
gidNumber: 2000
# go, ops.com
dn: cn=go,dc=ops,dc=com
cn: go
gidNumber: 500
objectClass: posixGroup
objectClass: top
# search result
search: 2
result: 0 Success
# numResponses: 3
# numEntries: 2
修改组
修改属性值
修改单个属性值
修改属性 gidNumber
cat > modify-group-attribute.ldif <<EOF
dn: cn=java,dc=ops,dc=com
changetype: modify
replace: gidNumber
gidNumber: 2000
EOF
执行命令
ldapadd -x \
-D "cn=admin,dc=ops,dc=com" \
-w admin \
-H ldap://localhost \
-f modify-group-attribute.ldif
输出
modifying entry "cn=java,dc=ops,dc=com"
修改完成后查询
ldapsearch -x \
-D "cn=admin,dc=ops,dc=com" \
-w admin \
-H ldap://localhost \
-b "dc=ops,dc=com" \
"(cn=java)"
输出
可以看到 gidNumber
已 经修改
# extended LDIF
#
# LDAPv3
# base <dc=ops,dc=com> with scope subtree
# filter: (cn=java)
# requesting: ALL
#
# java, ops.com
dn: cn=java,dc=ops,dc=com
objectClass: top
objectClass: posixGroup
cn: java
gidNumber: 2000
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
修改多个属性值
cat > modify-group-multiple-attributes.ldif <<EOF
dn: cn=java,dc=ops,dc=com
changetype: modify
replace: description
description: Java 项目研发组
-
replace: gidNumber
gidNumber: 2005
EOF
执行命令
ldapmodify -x \
-D "cn=admin,dc=ops,dc=com" \
-w admin \
-H ldap://localhost \
-f modify-group-multiple-attributes.ldif
输出
modifying entry "cn=java,dc=ops,dc=com"
修改完成后查看
可以看到,属性 description
、gidNumber
的值已经修改完成
$ echo SmF2YSDpobnnm67noJTlj5Hnu4Q=|base64 -d
Java 项目研发组
# extended LDIF
#
# LDAPv3
# base <cn=java,dc=ops,dc=com> with scope subtree
# filter: (objectClass=posixGroup)
# requesting: ALL
#
# java, ops.com
dn: cn=java,dc=ops,dc=com
objectClass: top
objectClass: posixGroup
cn: java
description:: SmF2YSDpobnnm67noJTlj5Hnu4Q=
gidNumber: 2005
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
增加属性
增加单个属性
增加属性 description
cat > add-group-attribute.ldif <<EOF
dn: cn=java,dc=ops,dc=com
changetype: modify
add: description
description: java开发组
EOF
执行命令
ldapadd -x \
-D "cn=admin,dc=ops,dc=com" \
-w admin \
-H ldap://localhost \
-f add-group-attribute.ldif
输出
modifying entry "cn=java,dc=ops,dc=com"
增加后查询
ldapsearch -x \
-D "cn=admin,dc=ops,dc=com" \
-w admin \
-H ldap://localhost \
-b "dc=ops,dc=com" \
"(cn=java)"
输出
这里输出的 description
因为 含有非 ASCII 字符(中文),LDIF 格式会自动把它编码成 Base64,解码之后内容如下
$ echo amF2YeW8gOWPkee7hA==|base64 -d
java开发组
注意这里的 description::
是 两个冒号(::),代表这个属性的值是 Base64 编码的,一个冒号(:) 是普通值
# extended LDIF
#
# LDAPv3
# base <dc=ops,dc=com> with scope subtree
# filter: (cn=java)
# requesting: ALL
#
# java, ops.com
dn: cn=java,dc=ops,dc=com
objectClass: top
objectClass: posixGroup
cn: java
gidNumber: 2000
description:: amF2YeW8gOWPkee7hA==
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
增加多个属性
cat > add-group-multiple-attribute.ldif <<EOF
dn: cn=java,dc=ops,dc=com
changetype: modify
add: description
description: java 项目开发组
-
add: memberUid
memberUid: xiaoming
memberUid: zhangsan
EOF
执行命令
ldapmodify -x \
-D "cn=admin,dc=ops,dc=com" \
-w admin \
-H ldap://localhost \
-f add-group-multiple-attribute.ldif
输出
modifying entry "cn=java,dc=ops,dc=com"
增加完成后查看
ldapsearch -x \
-D "cn=admin,dc=ops,dc=com" \
-w admin \
-H ldap://localhost \
-b "cn=java,dc=ops,dc=com" \
"(objectClass=posixGroup)"
输出
可以看到新增了 description
、memberUid
2个属性
$ echo amF2YSDpobnnm67lvIDlj5Hnu4Q=|base64 -d
java 项目开发组
# extended LDIF
#
# LDAPv3
# base <cn=java,dc=ops,dc=com> with scope subtree
# filter: (objectClass=posixGroup)
# requesting: ALL
#
# java, ops.com
dn: cn=java,dc=ops,dc=com
objectClass: top
objectClass: posixGroup
cn: java
gidNumber: 2005
description:: amF2YSDpobnnm67lvIDlj5Hnu4Q=
memberUid: xiaoming
memberUid: zhangsan
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
增加组成员
增加单个成员
用户 xiaoming
已经归属于主组 java
,现在要加入到附加组 go
cat > add-user-to-group.ldif << EOF
dn: cn=go,dc=ops,dc=com
changetype: modify
add: memberUid
memberUid: xiaoming
EOF
执行命令
ldapmodify -x \
-D "cn=admin,dc=ops,dc=com" \
-w admin \
-H ldap://localhost \
-f add-user-to-group.ldif
输出
modifying entry "cn=go,dc=ops,dc=com"
增加完成后查看
ldapsearch -x \
-D "cn=admin,dc=ops,dc=com" \
-w admin \
-H ldap://localhost \
-b "cn=go,dc=ops,dc=com" \
"(objectClass=posixGroup)"
输出
memberUid: xiaoming
表示附加组成员列表中有一个用户:xiaoming
# extended LDIF
#
# LDAPv3
# base <cn=go,dc=ops,dc=com> with scope subtree
# filter: (objectClass=posixGroup)
# requesting: ALL
#
# go, ops.com
dn: cn=go,dc=ops,dc=com
objectClass: top
objectClass: posixGroup
cn: go
gidNumber: 1003
memberUid: xiaoming
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
查询 xiaoming
这个用户对应的附加组
查询附加组
ldapsearch -x \
-D "cn=admin,dc=ops,dc=com" -w admin \
-H ldap://localhost \
-b "dc=ops,dc=com" "(&(objectClass=posixGroup)(memberUid=xiaoming))" cn
输出
可以看到 xiaoming
用户目前的附加组是 go
# extended LDIF
#
# LDAPv3
# base <dc=ops,dc=com> with scope subtree
# filter: (&(objectClass=posixGroup)(memberUid=xiaoming))
# requesting: cn
#
# go, ops.com
dn: cn=go,dc=ops,dc=com
cn: go
# search result
search: 2
result: 0 Success
# numResponses: 2
查看
查看某个组(附加组)中有哪些成员,可以查询这个组条目中的 memberUid
属性
ldapsearch -x -D "cn=admin,dc=ops,dc=com" -w admin \
-H ldap://localhost \
-b "cn=go,dc=ops,dc=com" \
-s base memberUid
增加多个成员
增加多个成员时,memberUid
可以写多行,每行一个成员
cat > add-users-to-group.ldif << EOF
dn: cn=go,dc=ops,dc=com
changetype: modify
add: memberUid
memberUid: xiaoqiang
memberUid: xiaoyu
EOF
执行命令
ldapmodify -x \
-D "cn=admin,dc=ops,dc=com" \
-w admin \
-H ldap://localhost \
-f add-users-to-group.ldif
输出
modifying entry "cn=go,dc=ops,dc=com"
增加完成后查看
查看某个组(附加组)中有哪些成员,可以查询这个组条目中的 memberUid
属性
ldapsearch -x -D "cn=admin,dc=ops,dc=com" -w admin \
-H ldap://localhost \
-b "cn=go,dc=ops,dc=com" \
-s base memberUid
输出
# extended LDIF
#
# LDAPv3
# base <cn=go,dc=ops,dc=com> with scope baseObject
# filter: (objectclass=*)
# requesting: memberUid
#
# go, ops.com
dn: cn=go,dc=ops,dc=com
memberUid: xiaoming
memberUid: xiaoqiang
memberUid: xiaoyu
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
删除属性
删除单个属性
删除属性 description
cat > delete-group-attribute.ldif <<EOF
dn: cn=java,dc=ops,dc=com
changetype: modify
delete: description
EOF
执行命令
ldapadd -x \
-D "cn=admin,dc=ops,dc=com" \
-w admin \
-H ldap://localhost \
-f delete-group-attribute.ldif
输出
modifying entry "cn=java,dc=ops,dc=com"
删除完成后查询
ldapsearch -x \
-D "cn=admin,dc=ops,dc=com" \
-w admin \
-H ldap://localhost \
-b "dc=ops,dc=com" \
"(cn=java)"
输出,可以看到 description
属性已经被删除了
# extended LDIF
#
# LDAPv3
# base <dc=ops,dc=com> with scope subtree
# filter: (cn=java)
# requesting: ALL
#
# java, ops.com
dn: cn=java,dc=ops,dc=com
objectClass: top
objectClass: posixGroup
cn: java
gidNumber: 2000
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
删除多个属性
cat > delete-group-multiple-attribute.ldif <<EOF
dn: cn=go,dc=ops,dc=com
changetype: modify
delete: description
-
delete: memberUid
-
EOF
执行命令
ldapmodify -x \
-D "cn=admin,dc=ops,dc=com" \
-w admin \
-H ldap://localhost \
-f delete-group-multiple-attribute.ldif
输出
modifying entry "cn=go,dc=ops,dc=com"
删除完成后查看
ldapsearch -x \
-D "cn=admin,dc=ops,dc=com" \
-w admin \
-H ldap://localhost \
-b "dc=ops,dc=com" \
"(&(objectClass=posixGroup)(cn=go))"
输出
可以看到 description
、memberUid
属性已经删除
# extended LDIF
#
# LDAPv3
# base <dc=ops,dc=com> with scope subtree
# filter: (&(objectClass=posixGroup)(cn=go))
# requesting: ALL
#
# go, ops.com
dn: cn=go,dc=ops,dc=com
objectClass: top
objectClass: posixGroup
cn: go
gidNumber: 1003
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
删除组
删除单个组
删除组命令执行完成后没有输出
ldapdelete -x \
-D "cn=admin,dc=ops,dc=com" \
-w admin \
-H ldap://localhost \
"cn=php,dc=ops,dc=com"
删除多个组
这里指定删除 java
和 go
2个组
cat > delete-multiple-groups.ldif <<EOF
dn: cn=java,dc=ops,dc=com
changetype: delete
dn: cn=go,dc=ops,dc=com
changetype: delete
EOF
执行命令
ldapmodify -x \
-D "cn=admin,dc=ops,dc=com" \
-w admin \
-H ldap://localhost \
-f delete-multiple-group.ldif
输出
deleting entry "cn=java,dc=ops,dc=com"
deleting entry "cn=go,dc=ops,dc=com"