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

  1. openldap-2*.rpm:提供 OpenLDAP 的配置文件和库。
  2. openldap-clients*.rpm 提供 OpenLDAP 的配置文件和库。
  3. 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的步骤有所帮助。因此,请使用评论部分让我知道您的建议和反馈。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/112097.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C语言必知必会 | 第四篇】一文带你精通顺序结构

引言 C语言是一门面向过程的、抽象化的通用程序设计语言&#xff0c;广泛应用于底层开发。它在编程语言中具有举足轻重的地位。 此文为【C语言必知必会】系列第四篇&#xff0c;进行C语言顺序结构的专项练习&#xff0c;结合专题优质题目&#xff0c;带领读者从0开始&#xff0…

[人工智能-综述-12]:第九届全球软件大会(南京)有感 -1-程序员通过大模型增强自身软件研发效率的同时,也在砸自己的饭碗

目录 前言&#xff1a; 一、什么是软件工程 1.1 什么软件工程 1.2 影响软件开发效能的三大因素 1.3 AI大模型是如何提升软件工程全过程效率的 二、AI大模型如何提升软件项目管理效率 2.1 概述 2.2 案例或工具 三、AI大模型如何提升软件开发工具的效率 3.1 概述 3.2 …

Git GUI使用笔记

看这个视频 Git GUI基本使用_哔哩哔哩_bilibili 1 下载 Git-2.42.0.2-64Window64位安装包-最新版资源-CSDN文库 安装软件就一路next就可以 2 配置 空白处右键&#xff0c;选择Open Git Bash here &#xff0c;输入下面两行配置信息 git config --global user.name "Y…

小程序之自定义组件 结合案例(会议OA的会议/投票管理及个人中心的搭建)详解 (4)

⭐⭐ 小程序专栏&#xff1a;小程序开发专栏 ⭐⭐ 个人主页&#xff1a;个人主页 目录 一.前言 二.小程序自定义组件及其使用 2.1 自定义组件的使用 三.使用自定义组件完成会议功能界面的实现 3.1 导航栏的实现 3.2 会议界面内容的实现 四.投票管理界面 五.个人中心 今天…

uview组件使用笔记

图标样式 修改图标的样式 通过color参数修改图标的颜色通过size参数修改图标的大小&#xff0c;单位为rpx 效果图 <u-icon name"photo" color"#2979ff" size"28"></u-icon>图片图标 1.3.0 这里说的图片图标&#xff0c;指的是小…

7、Linux驱动开发:设备-自动创建设备节点

目录 &#x1f345;点击这里查看所有博文 随着自己工作的进行&#xff0c;接触到的技术栈也越来越多。给我一个很直观的感受就是&#xff0c;某一项技术/经验在刚开始接触的时候都记得很清楚。往往过了几个月都会忘记的差不多了&#xff0c;只有经常会用到的东西才有可能真正记…

【力扣刷题】回文链表、环形链表、合并两个有序链表

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 Redis 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 刷题篇 一、回文链表1.1 题目描述1.2 思路分…

msvcr120.dll缺失怎么修复,快速修复msvcr120.dll丢失的三个有效方法

随着计算机技术的不断发展&#xff0c;我们在使用软件或游戏时经常会遇到各种错误提示&#xff0c;其中找不到msvcr120.dll就是一种常见的错误。那么&#xff0c;msvcr120.dll是什么&#xff1f;它的作用是什么&#xff1f;如何修复这一错误呢&#xff1f;本文将为您详细介绍几…

7.7亿参数,超越5400亿PaLM!UW谷歌提出「分步蒸馏」,只需80%训练数据|ACL 2023

LLM不实用&#xff0c;小模型蒸馏才是「现实」的大模型应用路线&#xff0c;全面领先微调技术&#xff01;土豪请无视。。。 大型语言模型虽然性能优异&#xff0c;可以用零样本或少样本提示解决新任务&#xff0c;但LLM在实际应用部署时却很不实用&#xff0c;内存利用效率低…

基于Java的汽车维修预约管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

群晖synology DSM 7.2设置钉钉Webhooks通知

现在越来越多的小伙伴都有了自己的Nas系统&#xff0c;为了更加方便的接收Nas的消息&#xff0c;这篇文章带着大家一起配置一个钉钉&#xff08;机器人&#xff09;即时消息通知 首先登录钉钉的开放平台&#xff1a;开发者后台统一登录 - 钉钉统一身份认证 1.创建一个机器人&…

基于蛇优化优化的BP神经网络(分类应用) - 附代码

基于蛇优化优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于蛇优化优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.蛇优化优化BP神经网络3.1 BP神经网络参数设置3.2 蛇优化算法应用 4.测试结果&#x…

基于Java的勤工助学管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

CEC2013(MATLAB):白鲨优化算法(White Shark Optimizer,WSO)求解CEC2013(提供MATLAB代码及参考文献)

一、白鲨优化算法原理 白鲨优化算法&#xff08;White Shark Optimizer&#xff0c;WSO&#xff09;由Malik Braik等人于2022年提出&#xff0c;该算法受大白鲨导航和觅食时具有的非凡听觉和嗅觉启发。该算法思路新颖&#xff0c;策略高效。【精选】单目标应用&#xff1a;白鲨…

微信小程序修改van-popup的背景颜色

效果图&#xff1a; van-popup背景颜色渐变 使用深度修改样式不生效&#xff0c;直接在 custom-style里面修改即可&#xff1b; <van-popup position"bottom"custom-style"height:25%;background:linear-gradient(95deg, #F8FCFF -0.03%, #EDF5FF 64.44…

01_introduction_to_diffusers_CN

&#x1f917; Diffusers 介绍 来源&#xff1a;https://github.com/huggingface/diffusion-models-class/blob/main/unit1/01_introduction_to_diffusers.ipynb 预备知识 在进入 Notebook 之前&#xff0c;你需要: &#x1f4d6; 阅读第一单元的材料&#x1f917; 在 Hugg…

第十四章lambda表达式与流处理

14.1 Iambda表达式 Iambda表达式简介 lambda表达式可以用非常少的代码实现抽象方法。 lambda表达式不能独立执行&#xff0c;因此必须实现函数式接口&#xff0c;并且会返回一个函数式接口的对象。 lambdab表达式的语法非常特殊 语法格式&#xff1a; &#xff08;&#xff0…

虚拟机如何联网【NAT】

查看VMWARE的IP地址 #进入root用户 su -#更改虚拟网卡设置界面 vi /etc/sysconfig/network-scripts/ifcfg-ens33 修改ONBOOT为yes BOOTPROTO为static IPADDR为前面的网段 192.168.211.xx (xx为自己设置的&#xff0c;可以随意设置&#xff0c;前面的为前面查看的IP地址的前…

Vue2之防抖_debounce封装函数v-debounce自定义指令(传参/不传)

目录 1、防抖 2、debounce - 封装函数 3、v-debounce 全局自定义指令 1、防抖 推荐文章 &#xff1a; https://blog.csdn.net/weixin_58099903/article/details/119902796 2、debounce - 封装函数 utils / tools.js /*** 函数防抖 是n秒后延迟执行&#xff0c;多用于页面scr…

MATLAB——神经网络参考代码

欢迎关注“电击小子程高兴的MATLAB小屋” %% I. 清空环境变量 clear all clc %% II. 训练集/测试集产生 %% % 1. 导入数据 load spectra_data.mat %% % 2. 随机产生训练集和测试集 temp randperm(size(NIR,1)); %打乱60个样本排序 % 训练集——50个样本 P_train NIR(…