OpenLDAP LDIF详解
手把手一步步搭建LDAP服务器并加域
- 有必要理解的概念
- LDAP
- Windows Active Directory
- 服务器配置
- 安装 OpenLDAP
- 自定义安装
- 修改对象(用户和分组等)
- 修改olcSuffix 和 olcRootDN 属性
- 增加olcRootPW 属性
- 修改olcAccess属性
- 验证新属性值
- 添加对象(用户、分组等)
- 添加组织单元
- 增加用户
- 添加分组
- 删除分组
- 总结
与其它博文和其它网络资料相比,本文会详细讲解LDIF配置。
有必要理解的概念
少说话,多做事。这里只介绍2个概念。
LDAP
LDAP是轻量级目录访问协议(Lightweight Directory Access Protocol),它是一种用于访问和维护分布式目录信息服务的协议,采用客户端-服务端模式,使用TCP/IP协议进行通信。
LDAP通常用于管理组织内的用户和资源信息,例如用户、组、计算机、打印机等,它允许用户通过一个唯一的身份标识符(DN)来访问目录,然后查找、修改和删除相关信息。
LDAP是一个跨平台的协议,可以在不同的操作系统、应用程序和设备之间互相通信。它的优点是安全、可靠、灵活、可扩展、易于管理,并且对于大型组织和企业应用特别有用。
Windows Active Directory
Windows Active Directory (AD) 是一种用于管理和控制网络中用户、计算机和应用程序的服务。它是 Microsoft Windows 操作系统家族中的集中式数据库,可用于存储和组织网络中的各种对象和信息,如用户帐户、计算机、组、共享文件、打印机等。它提供了一种集中式的身份验证和访问控制机制,可以帮助管理员轻松地管理网络中的各种资源,并确保网络安全性和合规性。
通过 Windows Active Directory,管理员可以创建、管理和删除用户、计算机和其他网络对象,控制用户和计算机的访问权限,分配组策略,设置安全策略,管理共享文件和打印机等网络资源。AD 还提供了单点登录 (SSO) 功能,使用户可以通过一次登录访问多个网络资源,提高了工作效率。同时,它还提供了多种安全功能,如加密、认证和审计,以保护网络安全。
总之,Windows Active Directory 是一种强大的集中式管理和控制网络资源的服务,可以帮助组织维护网络安全和合规性,提高工作效率和生产力。
服务器配置
为了演示本文,我使用的是 CentOS 7。在本文中,我将分享使用 在 ldapmodify Linux 平台上安装和配置 OpenLDAP 的详细步骤。在 openldap 的旧版本中,配置是使用 执行 slapd.conf 的,但现在配置保存在 cn=config 数据库中。因此,我们将使用 和 ldapmodify 来 cn=config 安装和配置 OpenLDAP。
安装 OpenLDAP
openldap-2*.rpm
:提供 OpenLDAP 的配置文件和库。openldap-clients*.rpm
提供 OpenLDAP 的配置文件和库。openldap-servers*.rpm
:提供配置和运行LDAP所需的服务器( slapd 、 slurpd )和其他实用程序。
如果仅配置客户端,则不需要包 openldap-servers*.rpm
。在 RHEL 系统上,您必须拥有 RHN 的有效订阅,或者您可以配置本地离线存储库,使用该存储库“yum”包管理器可以安装提供的 rpm 及其依赖项。
yum -y install openldap-clients openldap-servers
我们确保 slapd 将服务配置为自动启动,然后启动服务。
systemctl start slapd
systemctl enable slapd
ln -s '/usr/lib/systemd/system/slapd.service' '/etc/systemd/system/multi-user.target.wants/slapd.service'
检查服务的状态
[root@ldap-server ~]# systemctl status slapd
● slapd.service - OpenLDAP Server Daemon
Loaded: loaded (/usr/lib/systemd/system/slapd.service; disabled; vendor preset: disabled)
Active: active (running) since Sat 2023-02-09 21:46:23 IST; 17min ago
Docs: man:slapd
man:slapd-config
man:slapd-hdb
man:slapd-mdb
file:///usr/share/doc/openldap-servers/guide.html
Process: 17350 ExecStart=/usr/sbin/slapd -u ldap -h ${SLAPD_URLS} $SLAPD_OPTIONS (code=exited, status=0/SUCCESS)
Process: 17336 ExecStartPre=/usr/libexec/openldap/check-config.sh (code=exited, status=0/SUCCESS)
Main PID: 17352 (slapd)
Tasks: 3
Memory: 13.5M
CGroup: /system.slice/slapd.service
└─17352 /usr/sbin/slapd -u ldap -h ldapi:/// ldap:///Feb 09 22:01:32 ldap-server.example.com slapd[17352]: conn=1007 op=0 RESULT tag=97 err=0 text=
Feb 09 22:01:32 ldap-server.example.com slapd[17352]: conn=1007 op=1 MOD dn="olcDatabase={0}config,cn=config"
Feb 09 22:01:32 ldap-server.example.com slapd[17352]: conn=1007 op=1 MOD attr=olcRootDN
Feb 09 22:01:32 ldap-server.example.com slapd[17352]: ldif_read_file: checksum error on "/etc/openldap/slapd.d/cn=config/olcDatabase={0}config.ldif"
Feb 09 22:01:32 ldap-server.example.com slapd[17352]: conn=1007 op=1 RESULT tag=103 err=0 text=
Feb 09 22:01:32 ldap-server.example.com slapd[17352]: conn=1007 op=2 MOD dn="olcDatabase={0}config,cn=config"
Feb 09 22:01:32 ldap-server.example.com slapd[17352]: conn=1007 op=2 MOD attr=olcRootPW
Feb 09 22:01:32 ldap-server.example.com slapd[17352]: conn=1007 op=2 RESULT tag=103 err=0 text=
Feb 09 22:01:32 ldap-server.example.com slapd[17352]: conn=1007 op=3 UNBIND
Feb 09 22:01:32 ldap-server.example.com slapd[17352]: conn=1007 fd=11 closed
自定义安装
安装后,我们必须为 admin 用户生成密码。在此示例中,我们使用一个简单的密码:“ redhat ”
[root@ldap-server cn=config]# slappasswd
New password:
Re-enter new password:
{SSHA}eXlxd2J3d3dzdweXlxd2J3d3dzdw
修改对象(用户和分组等)
修改olcSuffix 和 olcRootDN 属性
OpenLDAP实际上将其信息存储在存储后端。我们可以将这些后端视为OpenLDAP使用的数据库。最常用的后端之一一直是 Berkeley DB back ends
,例如 bdb 或最近的 hdb 。存储在 hdb 后端的信息可以在 /etc/openldap/slapd.d/cn=config/olcDatabase={2}hdb.ldif
文件中找到。
在 LDIF 文件中,我们首先确定要添加、更改等的元素。为了唯一标识元素,我们使用 dn (可分辨名称)属性,该属性正是出于这个原因而创建的。因此,LDIF 文件的第一行可能是这样的:
dn: olcDatabase={2}hdb,cn=config
接下来,我们指定是否要添加属性、修改它等。
changeType: modify
如果我们想修改一个条目,我们还必须澄清我们是否要替换一个属性,删除它,等等。
replace: olcSuffix
最后,我们键入修改后属性的新值。
olcSuffix: dc=yyaw,dc=net
这整篇文章中还有许多 LDIF 示例,但现在,让我们回到 /etc/openldap/s-lapd.d/cn=config/olcDatabase={2}hdb.ldif
该文件。我们必须修改(至少)这两个条目:
olcSuffix: dc=yyqw,dc=com
olcRootDN: cn=Manager,dc=yyqw,dc=com
要使用 ldapmodify 进行所有这些更改,我们必须准备一个 LDIF 文件,如下所示:
[root@ldap-server ~]# cat yyqw_config.ldif
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=yyaw,dc=netdn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=admin,dc=yyaw,dc=net
第一行标识我们要更改的LDAP中的主条目。就在刚才,我们在 olcSuffix . /etc/openldap/slapd.d/cn=config/olcDatabase={2}hdb.ldif file
在此文件中,dn 属性为 ,由于文件位于 config 文件夹中,因此 full dn 属性为 dn: olcDatabase={2}hdb,cn=config dn: olcDatabase={2}hdb
。识别创建 LDIF 文件所需的数据的另一种(也许更好)方法是使用 ldapsearchcommand
.
[root@ldap-server ~]# ldapsearch -Y EXTERNAL -H ldapi:/// -b cn=config olcDatabase=\*
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
# extended LDIF
#
# LDAPv3
# base <cn=config> with scope subtree
# filter: olcDatabase=*
# requesting: ALL
## {-1}frontend, config
dn: olcDatabase={-1}frontend,cn=config
objectClass: olcDatabaseConfig
objectClass: olcFrontendConfig
olcDatabase: {-1}frontend# {0}config, config
dn: olcDatabase={0}config,cn=config
objectClass: olcDatabaseConfig
olcDatabase: {0}config
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external
,cn=auth" manage by * none# {1}monitor, config
dn: olcDatabase={1}monitor,cn=config
objectClass: olcDatabaseConfig
olcDatabase: {1}monitor
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external
,cn=auth" read by dn.base="cn=Manager,dc=yyqw,dc=com" read by * none# {2}hdb, config
dn: olcDatabase={2}hdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {2}hdb
olcDbDirectory: /var/lib/ldap
olcSuffix: dc=yyqw,dc=com
olcRootDN: cn=Manager,dc=yyqw,dc=com
olcDbIndex: objectClass eq,pres
olcDbIndex: ou,cn,mail,surname,givenname eq,pres,sub# search result
search: 2
result: 0 Success# numResponses: 5
# numEntries: 4
我们使用适当的名称保存LDIF文件,例如, yyqw_config.ldif 我们执行 ldapmodify .
[root@ldap-server ~]# ldapmodify -Y EXTERNAL -H ldapi:/// -f yyqw_config.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={2}hdb,cn=config"modifying entry "olcDatabase={2}hdb,cn=config"
增加olcRootPW 属性
要添加新属性,我们使用“ add ”,然后使用属性名称,如以下示例所示。在这里,我们创建另一个LDIF文件 (yybw.ldif) 来添加 olcRootPW 属性。
[root@ldap-server ~]# cat yybw.ldif
dn: olcDatabase={2}hdb,cn=config
changeType: modify
add: olcRootPW
olcRootPW: {SSHA}eXlxd2J3d3dzdweXlxd2J3d3dzdw
我们再次执行 ldapmodify 。
[root@ldap-server ~]# ldapmodify -Y EXTERNAL -H ldapi:/// -f yybw.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={2}hdb,cn=config"
修改olcAccess属性
我们还必须允许 我们之前 (cn=admin,dc=yyaw,dc=net
) 刚刚指定的管理员用户访问LDAP数据库 。如果我们看一下 olcDatabase={1}monitor.ldif
,文件,我们将看到以下行:
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external, cn=auth" read by dn.base="cn=manager,dc=yyqw,dc=com" read by * none
我们必须编辑文件或使用 ldapmodify 来更改条目。如果我们使用 ldapmodify,LDIF 文件应该是这样的:
[root@ldap-server ~]# cat yyww.ldif
dn: olcDatabase={1}monitor,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external, cn=auth" read by dn.base="cn=admin,dc=yyaw,dc=net" read by * none
同样,我们通过传递新的 LDIF 文件作为参数来执行 ldapmodify 。
[root@ldap-server ~]# ldapmodify -Y EXTERNAL -H ldapi:/// -f yyww.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={1}monitor,cn=config"
验证新属性值
现在我们可以检查属性的值 ldapsearch 是否实际更改。
[root@ldap-server ~]# ldapsearch -Y EXTERNAL -H ldapi:/// -b cn=config olcDatabase=\*
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
# extended LDIF
#
# LDAPv3
# base <cn=config> with scope subtree
# filter: olcDatabase=*
# requesting: ALL
## {-1}frontend, config
dn: olcDatabase={-1}frontend,cn=config
objectClass: olcDatabaseConfig
objectClass: olcFrontendConfig
olcDatabase: {-1}frontend# {0}config, config
dn: olcDatabase={0}config,cn=config
objectClass: olcDatabaseConfig
olcDatabase: {0}config
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external
,cn=auth" manage by * none# {1}monitor, config
dn: olcDatabase={1}monitor,cn=config
objectClass: olcDatabaseConfig
olcDatabase: {1}monitor
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external
, cn=auth" read by dn.base="cn=admin,dc=yyaw,dc=net" read by * none# {2}hdb, config
dn: olcDatabase={2}hdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {2}hdb
olcDbDirectory: /var/lib/ldap
olcDbIndex: objectClass eq,pres
olcDbIndex: ou,cn,mail,surname,givenname eq,pres,sub
olcRootPW: {SSHA}eXlxd2J3d3dzdweXlxd2J3d3dzdw
olcSuffix: dc=yyaw,dc=net
olcRootDN: cn=admin,dc=yyaw,dc=net# search result
search: 2
result: 0 Success# numResponses: 5
# numEntries: 4
如我们所见,该值已根据我们在 LDIF 文件中指定的内容进行了更改。我们可以用来检查配置的另一个工具是 slaptest 命令。
[root@ldap-server ~]# slaptest -u
config file testing succeeded
添加对象(用户、分组等)
现在我们必须在LDAP服务器 dc=yyaw,dc=net
中手动创建一个条目。执行此操作的最简单方法是为此条目创建一个 LDIF 文件并将其传递给 ldapadd 命令。因此,我们创建了一个名为 yyaw-net.ldif 的文件,其中包含以下内容:
[root@ldap-server ~]# cat yyaw-net.ldif
dn: dc=yyaw,dc=net
objectClass: dcObject
objectClass: organization
dc: yyaw
o: yyaw
我们指定一系列属性,例如可分辨名称 (dn)、域组件 (dc) 和组织 (o)。我们还将新条目定义为 dcObject 和组织类型的对象。现在我们执行 ldapadd 并将 yyaw-net.ldif 文件作为参数传递给它。我们使用 (-f) 指定文件名、管理员用户 (-D) 以及我们为该管理员用户 (-w) 定义的密码。
[root@ldap-server ~]# ldapadd -f yyaw-net.ldif -D cn=admin,dc=yyaw,dc=net -w redhat
adding new entry "dc=yyaw,dc=net"
我们可以使用 ldapsearch 命令检查条目是否成功创建。
[root@ldap-server ~]# ldapsearch -x -b dc=yyaw,dc=net
# extended LDIF
#
# LDAPv3
# base <dc=yyaw,dc=net> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
## example.com
dn: dc=yyaw,dc=net
objectClass: dcObject
objectClass: organization
dc: example
o: example# search result
search: 2
result: 0 Success# numResponses: 2
# numEntries: 1
您刚刚看到了如何将对象 dc=yyaw,dc=net 添加到我们的 LDAP 中。现在,您将了解如何添加单位部门、群组和用户。
添加组织单元
也许我们希望调用 users 一个组织单位 (OU) 来存储所有 LDAP 用户。为此,我们将创建一个名为 users.ldif 的新 LDIF 文件,其中包含以下内容:
[root@ldap-server ~]# cat users.ldif
dn: ou=users,dc=yyaw,dc=net
objectClass: organizationalUnit
ou: users
我们再次执行 ldapadd 以创建 OU。
[root@ldap-server ~]# ldapadd -f users.ldif -D cn=admin,dc=yyaw,dc=net -w redhat
adding new entry "ou=users,dc=yyaw,dc=net"
增加用户
现在,我们可以在单位部门中包含用户。该过程与我们目前所看到的非常相似。首先,我们创建一个名为 yybed.ldif 的文件,其中包含以下内容:
[root@ldap-server ~]# cat yybed.ldif
dn: cn=yyyq,ou=users,dc=yyaw,dc=net
cn: yydx
sn: Syracuse
objectClass: inetOrgPerson
userPassword: eureka
uid: yydx
然后我们再次执行 ldapadd 。
[root@ldap-server ~]# ldapadd -f yybed.ldif -x -D cn=admin,dc=yyaw,dc=net -w redhat
adding new entry "cn=yyyq,ou=users,dc=yyaw,dc=net"
ldap_add: Invalid syntax (21)
additional info: objectClass: value #0 invalid per syntax
此消息的意思是对象 inetOrgPerson 未加载到核心架构中,因此我们必须包含它。在 /etc/openldap/schema
文件夹中,有许多LDIF文件可以在需要时扩展架构。我们可以看到有一个 yygm.ldif
文件,其中包含 inetOrgPerson
对象的架构定义。
架构本身包含在 LDAP 数据库中,因此我们可以使用命令 ldapadd 向其添加新定义。当我们要修改配置本身而不是数据时,我们将自己验证为外部根用户 ( -Y EXTERNAL )。
[root@ldap-server ~]# ldapadd -Y EXTERNAL -H ldapi:// -f /etc/openldap/schema/yygm.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=inetorgperson,cn=schema,cn=config"
ldap_add: Other (e.g., implementation specific) error (80)
additional info: olcObjectClasses: AttributeType not found: "audio"
如我们所见,我们收到一个错误,因为未定义属性类型音频。因此,我们也必须在 模式中包含此定义 。如果我们在 /etc/openldap/schema/ 文件夹中的文件中搜索字符串频率,我们将看到 ttaw.ldif 属性 audio 在文件中定义。因此,我们首先使用此 LDIF 文件扩展架构。
[root@ldap-server ~]# ldapadd -Y EXTERNAL -H ldapi:// -f /etc/openldap/schema/ttaw.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=cosine,cn=schema,cn=config"
现在我们对 yygm.ldif 文件做同样的事情。
[root@ldap-server ~]# ldapadd -Y EXTERNAL -H ldapi:// -f /etc/openldap/schema/yygm.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=inetorgperson,cn=schema,cn=config"
接下来我们还添加 nis.ldif 文件
[root@ldap-server ~]# # ldapadd -Y EXTERNAL -H ldapi:// -f /etc/openldap/schema/nis.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=nis,cn=schema,cn=config"
现在,我们可以将用户添加到我们之前创建的文件 yybed.ldif 中。
[root@ldap-server ~]# ldapadd -f yybed.ldif -x -D cn=admin,dc=yyaw,dc=net -w redhat
adding new entry "cn=yyyq,ou=users,dc=yyaw,dc=net"
如果在某些时候我们必须查看当前使用的模式,我们可以像这样使用 slapcat 命令:
[root@ldap-server ~]# slapcat -b "cn=schema,cn=config"
dn: cn=config
objectClass: olcGlobal
cn: config
olcArgsFile: /var/run/openldap/slapd.args
olcPidFile: /var/run/openldap/slapd.pid
olcTLSCACertificatePath: /etc/openldap/certs
olcTLSCertificateFile: "OpenLDAP Server"
olcTLSCertificateKeyFile: /etc/openldap/certs/password
structuralObjectClass: olcGlobal
entryUUID: 35694bfc-c0d9-1038-87ee-811b58b4e51a
creatorsName: cn=config
createTimestamp: 20230209170930Z
entryCSN: 20230209170930.732544Z#000000#000#000000
modifiersName: cn=config
modifyTimestamp: 20230209170930Z
--
--
<OUTPUT TRUNCATED>
--
--
dn: olcDatabase={2}hdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {2}hdb
olcDbDirectory: /var/lib/ldap
olcDbIndex: objectClass eq,pres
olcDbIndex: ou,cn,mail,surname,givenname eq,pres,sub
structuralObjectClass: olcHdbConfig
entryUUID: 97A468DA-540B-DC27-2081-4C07C5488224
creatorsName: cn=config
createTimestamp: 20230209170930Z
olcRootPW:: e1NTSEF9NnpIdEEyMHFrVG1kTHJKU2Z4bytWVjNRTEdTN20wQ1o=
olcSuffix: dc=yyaw,dc=net
olcRootDN: cn=admin,dc=yyaw,dc=net
entryCSN: 20230209171424.210710Z#000000#000#000000
modifiersName: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
modifyTimestamp: 20230209171424Z
添加分组
要添加组,我们重复相同的过程。首先, group.ldif 我们创建包含以下内容的文件:
[root@ldap-server ~]# cat group.ldif
dn: cn=scientists,ou=users,dc=yyaw,dc=net
cn: scientists
objectClass: groupOfNames
member: cn=yyyq,ou=users,dc=yyaw,dc=net
我们用ldapadd添加组。
[root@ldap-server ~]# ldapadd -f group.ldif -x -D cn=admin,dc=yyaw,dc=net -w redhat
adding new entry "cn=scientists,ou=users,dc=yyaw,dc=net"
删除分组
除了添加或编辑,我们还可以从LDAP服务器中删除对象。该过程甚至更容易,因为我们不必创建任何LDIF文件。我们只是使用 ldapdel 我们要删除的执行 cn 。
[root@ldap-server ~]# ldapdelete "cn=yyyq,ou=users,dc=yyaw,dc=net" -D cn=admin,dc=yyaw,dc=net -w redhat
我们可以检查该条目是否确实被禁止。
[root@ldap-server ~]# ldapsearch -x -b "dc=yyaw,dc=net" "(cn=yydx)"
# extended LDIF
#
# LDAPv3
# base <dc=yyaw,dc=net> with scope subtree
# filter: (cn=yydx)
# requesting: ALL
## search result
search: 2
result: 0 Success# numResponses: 1
总结
在本文中,我分享了在 CentOS 7 Linux 节点上从头开始安装和配置 openldap 的分步说明。在整篇文章中解释每个步骤时,我试图进行描述性,尽管我建议初学者在进入配置之前先了解有关 openldap 术语的更多信息。最后,我希望本文中在Linux上安装和配置OpenLDAP的步骤有所帮助。因此,请使用评论部分让我知道您的建议和反馈。
相关文章:

OpenLDAP LDIF详解
手把手一步步搭建LDAP服务器并加域 有必要理解的概念LDAPWindows Active Directory 服务器配置安装 OpenLDAP自定义安装修改对象(用户和分组等)修改olcSuffix 和 olcRootDN 属性增加olcRootPW 属性修改olcAccess属性验证新属性值 添加对象(用…...
Leetcode.33 搜索旋转排序数组
题目链接 Leetcode.33 搜索旋转排序数组 mid 题目描述 整数数组 n u m s nums nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前, n u m s nums nums 在预先未知的某个下标 k ( 0 ≤ k < n u m s . l e n g t h )…...

ES 8.x 向量检索性能测试 把向量检索性能提升100倍!
向量检索不仅在的跨模态检索场景中应用广泛,随着chat gpt的或者,利用es的向量检索,在Ai领域发挥着越来越大的作用。 本文,主要测试es的向量检索性能。我从8.x就开始关注ES的向量检索了。当前ES已经发布到 8.10 版本。以下是官方文…...

云计算——ACA学习 云计算架构
作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 公众号:网络豆云计算学堂 座右铭:低头赶路,敬事如仪 个人主页: 网络豆的主页 目录 写在前面 前期回顾 本期介绍 一.云计算架…...

基于深度学习实现一张单图,一个视频,一键换脸,Colab脚本使用方法,在线版本,普通人也可以上传一张图片体验机器学习一键换脸
基于深度学习实现一张单图,一个视频,一键换脸,Colab脚本使用方法,在线版本,普通人也可以上传一张图片体验机器学习一键换脸。 AI领域人才辈出,突然就跳出一个大佬“s0md3v”,开源了一个单图就可以进行视频换脸的项目。 项目主页给了一张换脸动图非常有说服力,真是一图…...

leetcode 21
递归的方式 class Solution { public:ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {if(l1 nullptr){return l2;}else if(l2 nullptr){return l1;}else if(l1->val < l2->val){l1->next mergeTwoLists(l1->next, l2);return l1;}else if(l1->va…...
【Spring Cloud】openfeign负载均衡方案(和lb发展历史)
文章目录 版本1:原始loadBalancerClient方案版本2:ribbon-loadbalancer方案版本3:openfeign方案(即**方案2openfeign版本**) 本文描述了Spring Cloud微服务中,各个服务间调用的负载均衡方案的升级历史&…...
R语言:主成分分析PCA
文章目录 主成分分析处理步骤数据集code主成分分析 主成分分析(或称主分量分析,principal component analysis)由皮尔逊(Pearson,1901)首先引入,后来被霍特林(Hotelling,1933)发展。 主成分分析是一种通过降维技术把多个变量化为少数几个主成分(即综合变量)的统计分…...
Linux下磁盘备份、文件备份和定时备份命令指南
文章目录 磁盘备份和定时备份命令指南1. 引言2. 磁盘备份命令dda. 简介和基本用法b. dd命令的参数和选项说明c. 使用dd命令进行磁盘镜像备份的步骤d. 恢复备份数据的方法和注意事项e. 示例:使用dd命令备份和还原磁盘镜像 3. 磁盘备份命令tara. 简介和基本用法b. tar…...

电脑软件:推荐一款非常强大的pdf阅读编辑软件
目录 一、软件简介 二、功能介绍 1、界面美观,打开速度快 2、可直接编辑pdf 3、非常强大好用的注释功能 4、很好用的页面组织和提取功能 5、PDF转word效果非常棒 6、强大的OCR功能 三、软件特色 四、软件下载 pdf是日常办公非常常见的文档格式,…...
Android 13.0 系统开机屏幕设置默认横屏显示
1.概述 在13.0的系统产品开发中,对于产品需求来说,由于是宽屏设备所以产品需要开机默认横屏显示,开机横屏显示这就需要从 两部分来实现,一部分是系统开机动画横屏显示,另一部分是系统屏幕显示横屏显示,从这两方面就可以做到开机默认横屏显示了 2.系统开机设置默认横屏显…...
Redis -- 基础知识1
1.介绍 1.初识Redis Redis:The open source, in-memory data store used by millions of developers as a database, cache, streaming engine, and message broker. in-memory data:在内存中存储,Redis是在分布式系统中存储起作用的 解释&am…...

ubuntu 20.04 passwd 指令不能使用
Linux 更改用户密码报Changing password for user 用户名. passwd: Module is unknown或更改新增用户密码passwd:未知的用户名 报错信息如下: 解决方法: 可以排查 /etc/pam.d/passwd配置文件 注释掉包含pam_passwdqc.so模块的行,…...

单片机郭天祥(02)
1:解决keil5软件的乱码问题,修改编码为UTF-8 2:打开keil5使用debug对编写好的程序进行调试 给程序打上断点 使用仿真芯片 更改设备管理器相关设置 接通电源后点击debug连接到51单片机 使用stc-isp获取延时函数 将延时函数添加进入创建好的…...

Hadoop3教程(三十五):(生产调优篇)HDFS小文件优化与MR集群简单压测
文章目录 (168)HDFS小文件优化方法(169)MapReduce集群压测参考文献 (168)HDFS小文件优化方法 小文件的弊端,之前也讲过,一是大量占用NameNode的空间,二是会使得寻址速度…...
metersphere 接口自动化
Metersphere 使用步骤大致如下: 安装 Metersphere Metersphere 是一款基于 Docker 的应用程序,因此在使用 Metersphere 之前,需要先安装 Docker。安装 Docker 后,再下载 Metersphere 的安装包并解压缩。 启动 Metersphere 在终…...
Mac上安装和配置Git
在Mac上安装和配置Git是一个相对简单的过程,以下是一份详细的步骤指南。 首先,你需要确保你的Mac已经安装了Homebrew(如果还没有安装,可以通过以下命令安装:),Homebrew是一个包管理器ÿ…...

【文件操作】Java -操作File对象
个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ 文件操作 Java - File对象 Java - File对象 Fi…...
Socks5代理技术:驱动数字化时代跨界发展的利器
随着全球数字化进程的加速推进,Socks5代理技术作为一项关键的网络技术正日益成为推动跨界电商、爬虫数据分析、企业出海以及游戏体验优化等领域发展的重要驱动力。其高效稳定的网络连接能力以及灵活的应用方式,不仅为企业提供了全球市场拓展的无限可能&a…...

基于二维小波变换的散斑相位奇异构造算法matlab仿真
目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 图(1)表示散斑原图像,(2)表示对(1)图像进行x轴方向的极化分析的小波相位图,呈周期的水平条纹,(3)表示对(1)图像…...

IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...

大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...

DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...

Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...