当前位置: 首页 > news >正文

如何在CentOS 7上使用FreeIPA设置集中式Linux身份验证

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。

简介

FreeIPA 是一个针对 Linux 的开源安全解决方案,提供帐户管理和集中式身份验证,类似于微软的 Active Directory。FreeIPA 基于多个开源项目构建,包括 389 目录服务器、MIT Kerberos 和 SSSD。

FreeIPA 客户端适用于 CentOS 7、Fedora 和 Ubuntu 14.04/16.04。这些客户端使得将机器添加到 IPA 域相当简单。其他操作系统可以使用 SSSD 或 LDAP 进行 FreeIPA 身份验证。

在本教程中,我们将在 CentOS 7 服务器上安装 FreeIPA 服务器。然后,您可以配置客户端机器,允许 FreeIPA 用户使用他们的 IPA 凭据登录。

在按照本教程操作后,您可以在 Ubuntu 16.04 上配置 FreeIPA 客户端,或者在 CentOS 7 上配置 FreeIPA 客户端。

先决条件

要按照本教程操作,您需要:

  • 一台至少具有 1GB RAM 的 CentOS 7 服务器。默认情况下,CentOS 7 只使用 root 用户。因为我们将使用 FreeIPA 管理用户,所以不需要手动添加另一个用户。您可以简单地按照本教程使用 root 用户。

  • 服务器上启用了防火墙,您可以按照 CentOS 7 教程中的防火墙步骤进行设置。这是强烈建议的,因为 FreeIPA 处理敏感用户凭据。

  • 完全注册的域,用于服务器和客户端。您可以在 Namecheap 上购买一个,或者在 Freenom 上免费获取一个。

  • 为您的服务器设置以下 DNS 记录。您可以按照主机名教程中的详细信息进行设置。

    • 一个 A 记录,将您的服务器名称(例如 ipa.example.com)指向您服务器的 IPv4 地址。
    • 一个 AAAA 记录,将您的服务器名称指向您服务器的 IPv6 地址,如果您希望通过 IPv6 访问您的服务器。
  • 可选地,使用 yum install nano 安装 nano 文本编辑器。CentOS 默认使用 vi 文本编辑器,但 nano 可能更加用户友好。

步骤 1 — 准备 IPA 服务器

在开始安装任何内容之前,我们需要做一些事情,以确保服务器准备好运行 FreeIPA。具体来说,我们将设置服务器主机名,更新系统软件包,检查先决条件中的 DNS 记录是否已传播,并确保防火墙允许流量到 FreeIPA。

首先,您的服务器的主机名需要与您的完全合格域名(FQDN)匹配,以使 FreeIPA 正常工作。在本教程中,我们将使用 ipa.example.com 作为 FQDN。

您可以在创建服务器时设置主机名,也可以在创建服务器后使用 hostname 命令从命令行设置主机名:

hostname ipa.example.org

现在,使用 yum 更新软件包存储库。

yum update

接下来,在防火墙中打开 FreeIPA 所需的端口。

firewall-cmd --permanent --add-port={80/tcp,443/tcp,389/tcp,636/tcp,88/tcp,464/tcp,53/tcp,88/udp,464/udp,53/udp,123/udp}

重新加载防火墙,以使更改生效。

firewall-cmd --reload

最后,您需要验证 DNS 名称是否正确解析。您可以使用 dig 命令进行此操作。安装 bind-utils 软件包以获取 dig 和其他 DNS 测试实用程序。

yum install bind-utils

然后使用 dig 检查 A 记录。

dig +short ipa.example.org A

这应该返回 your_server_ipv4

如果启用了 IPv6,您可以以相同的方式测试 AAAA 记录。

dig +short ipa.example.org AAAA

这应该返回 your_server_ipv6

您还可以测试反向查找。这会测试您是否可以从 IP 地址解析主机名。

dig +short -x your_server_ipv4
dig +short -x your_server_ipv6

这两者都应返回 ipa.example.com.

FreeIPA 大量使用 DNS,因此在下一步中,我们将确保我们的服务器满足 FreeIPA 正常工作所需的特定 DNS 要求。

步骤 2 — 设置 DNS

所有运行 FreeIPA 的机器必须使用完全合格的域名(FQDN)作为其主机名,这是我们在上一步中设置的。此外,每台服务器的主机名必须解析到其 IP 地址,而不是解析为 localhost

在 DigitalOcean 上,您可以在控制面板上查看服务器的公共 IP 地址。您也可以使用 ip 命令找到服务器的 IP 地址。

ip addr show

这应该产生类似以下的输出:


. . .
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ffinet 111.111.111.111/18 brd 111.111.111.255 scope global eth0valid_lft forever preferred_lft foreverinet6 1111:1111:1111:1111::1111:1111/64 scope globalvalid_lft forever preferred_lft forever
. . .

IPv4 地址直接出现在 inet 之后,如果启用了 IPv6,则在 inet6 之后出现 IPv6 地址。如果启用了私有网络,您可能还会看到其他私有 IP 地址;您可以忽略这些地址。要区分公共和私有 IP 地址,注意私有 IPv4 地址将在以下范围内:192.168.*.*10.*.*.*172.16.*.*172.31.*.*。私有 IPv6 地址将始终以前缀 fe80:: 开头。

现在,我们需要更改主机文件,将服务器的主机名指向其外部 IP 地址。主机文件 /etc/hosts 在本地将域名映射到 IP 地址。使用 nano 或您喜欢的文本编辑器打开此文件。

nano /etc/hosts

查找在 127.0.0.1 之后具有您服务器主机名的行:


. . .```markdown
# 以下内容适用于支持 IPv4 的主机
127.0.0.1 ipa.example.com ipa.example.com
127.0.0.1 localhost.localdomain localhost
127.0.0.1 localhost4.localdomain4 localhost4
. . .

127.0.0.1 更改为您的服务器 IPv4 地址。

. . .
# 以下内容适用于支持 IPv4 的主机
your_server_ipv4 ipa.example.com ipa.example.com
127.0.0.1 localhost.localdomain localhost
127.0.0.1 localhost4.localdomain4 localhost4
. . .

如果您启用了 IPv6,您还需要编辑 IPv6 映射,将 ::1 行更改为您的主机名。

...
# 以下内容适用于支持 IPv6 的主机
::1 ipa.example.com ipa.example.com
::1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
...

::1 更改为您的服务器 IPv6 地址。

...
# 以下内容适用于支持 IPv6 的主机
your_server_ipv6 ipa.example.com ipa.example.com
::1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
...

保存并退出文件。

默认情况下,每次系统启动时,CentOS 使用 /etc/cloud/templates/hosts.redhat.tmpl 中的配置来生成 /etc/hosts。为了使此配置更改永久生效,我们还需要在该文件中进行类似的更改。

打开文件。

super_user
nano /etc/cloud/templates/hosts.redhat.tmpl

127.0.0.1 ${fqdn} ${hostname} 行更改为使用您的服务器 IPv4 地址。

...
# 以下内容适用于支持 IPv4 的主机
your_server_ipv4 ${fqdn} ${hostname}
127.0.0.1 localhost.localdomain localhost
127.0.0.1 localhost4.localdomain4 localhost4
...

类似地,如果您使用 IPv6,将 ::1 ${fqdn} ${hostname} 行更改为使用您的 IPv6 地址。

...
# 以下内容适用于支持 IPv6 的主机
your_server_ipv6 ${fqdn} ${hostname}
::1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
...

退出并保存文件。

接下来,我们将配置 CentOS 中的随机数生成器。这将允许 FreeIPA 执行所需的身份验证加密功能。

步骤 3 — 配置随机数生成器

设置 FreeIPA 需要大量随机数据来运行的加密操作。默认情况下,虚拟机会很快耗尽随机数据或熵。为了解决这个问题,我们将使用 rngd,一个软件随机数生成器。rngd 通过从服务器连接的硬件设备获取数据并将其输入到内核的随机数生成器中来工作。

首先,安装 rngd

super_user
yum install rng-tools

然后启用它。

super_user
systemctl start rngd

确保服务在启动时自动启动。

super_user
systemctl enable rngd

最后,验证 rngd 是否正在运行。

command
systemctl status rngd

输出应包含绿色的 active (running)

所有依赖项配置并正常运行后,我们可以继续安装 FreeIPA 服务器软件本身。

步骤 4 — 安装 FreeIPA 服务器

我们可以继续安装 ipa-server,即 FreeIPA 服务器软件包本身。

super_user
yum install ipa-server

然后运行 FreeIPA 安装命令。这将运行一个脚本,提示您进行配置选项并安装 FreeIPA。

super_user
ipa-server-install

除了身份验证外,FreeIPA 还具有管理主机的 DNS 记录的功能。这可以使主机的配置和管理更加简单。在本教程中,我们将不使用 FreeIPA 的集成 DNS。这对于基本设置是不需要的。

[secondary_label 安装脚本提示]
Do you want to configure integrated DNS (BIND)? [no]: no

接下来,您需要输入服务器的主机名、域名和 Kerberos 领域名称。Kerberos 是 FreeIPA 在幕后用于对主机机器进行身份验证的认证协议。强烈建议您将域名用作 Kerberos 领域名称。使用不同的命名方案将导致 FreeIPA 与 Active Directory 集成出现问题,并可能引起其他问题。

[secondary_label 安装脚本提示]
Server host name [ipa.example.org]: ipa.example.org
Please confirm the domain name [example.org]: ipa.example.org
Please provide a realm name [EXAMPLE.ORG]: IPA.EXAMPLE.ORG

接下来,创建 LDAP 目录管理员的密码。这对于 FreeIPA 的 LDAP 功能是必需的。然后是 IPA 管理员密码,将用于以管理员用户身份登录 FreeIPA。在这里使用安全的随机生成密码是非常推荐的,因为整个系统的安全性取决于它们。

确认配置。之后,安装程序将运行。

[secondary_label 安装脚本提示]
Continue to configure the system with these values? [no]: yes

安装过程可能需要几分钟,具体取决于服务器的速度。

现在我们已经完成了服务器安装,我们需要对其进行测试。


## 步骤 5 — 验证 FreeIPA 服务器功能首先,通过尝试为 admin 用户初始化 Kerberos 令牌来验证 Kerberos 领域是否正确安装。```super_user
kinit admin

如果工作正常,这应该会提示您输入安装过程中输入的 IPA 管理员密码。输入密码,然后按 ENTER

接下来,验证 IPA 服务器是否正常运行。

ipa user-find admin

这应该会打印出以下内容:

--------------
1 user matched
--------------User login: adminLast name: AdministratorHome directory: /home/adminLogin shell: /bin/bashPrincipal alias: admin@IPA.EXAMPLE.COMUID: 494800000GID: 494800000Account disabled: False
----------------------------
Number of entries returned 1
----------------------------

我们还应该能够在 https://ipa.example.com 访问 web UI。

在 web UI 中,以 admin 用户身份登录。用户名 将是 admin密码 将是您之前设置的 IPA 管理员密码。页面顶部将显示 Authenticating…,然后您将被带到主 IPA 页面,看起来像这样:

!FreeIPA UI 主页面

最后,让我们通过添加新用户来探索一些 FreeIPA 的功能。

步骤 6 — 配置 IPA 用户

FreeIPA 拥有非常丰富的用户管理和策略功能。与标准的 Unix 用户类似,FreeIPA 用户可以属于组。基于策略,可以允许或拒绝组或个别用户访问主机(客户端机器)或主机组(hostgroups)。FreeIPA 还可以管理 sudo 访问;可以在主机或主机组上授予组或用户 sudo 访问权限。

本教程将简要介绍如何添加新用户以帮助您入门。

要添加用户,请单击 Identity 选项卡,然后单击 Users。这将显示一个用户表。单击表格上方的 + Add 按钮以添加新用户。在打开的表单中填写必填字段(如名和姓),然后单击 Add 以添加用户,或者单击 Add and edit 以配置高级详细信息。

管理员也可以通过单击原始表中的用户来访问高级详细信息。这是管理员在查看用户详细信息时看到的内容:

!FreeIPA UI 用户编辑

普通用户也可以登录到 IPA GUI。他们将能够查看自己的权限并编辑个人详细信息。

新用户在首次登录到 IPA 机器时将被要求更改密码。这在 IPA GUI 中以及通过 SSH 上也适用。一个有用的功能是能够添加 SSH 密钥。用户可以上传他们的公共 SSH 密钥,并使其传播到 IPA 机器,从而实现无密码登录。用户随时可以删除 SSH 密钥,而无需担心它仍然存在于各个服务器上。

结论

现在您已经拥有一个可用的 FreeIPA 服务器,您需要配置客户端以对其进行身份验证。您可以按照此 Ubuntu 16.04 FreeIPA 客户端教程或此 CentOS 7 FreeIPA 客户端教程进行操作。此外,FreeIPA 是一个 LDAP 服务器。任何支持 LDAP 认证的服务都可以设置为针对您的 FreeIPA 服务器进行身份验证。

您可以通过 FreeIPA GUI 或其 CLI 配置用户、组和访问策略。Sudo 规则可以提供一个相对简单的方式来管理 root 访问权限。对于较大的部署,建议设置多个 IPA 服务器进行复制。最后,如果您希望与 Windows 环境进行桥接,可以建立与 Active Directory 服务器的信任关系。

FreeIPA 是一个非常多才多艺的身份验证工具,您接下来需要做的事取决于您打算如何使用它。有关更多信息,请访问 FreeIPA 网站上的文档资源列表。

相关文章:

如何在CentOS 7上使用FreeIPA设置集中式Linux身份验证

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 简介 FreeIPA 是一个针对 Linux 的开源安全解决方案&#xff0c;提供帐户管理和集中式身份验证&#xff0c;类似于微软的 Active Direc…...

vue2播放视频和预览文件的组件以及使用方法

##文件预览组件 按照组件 解决展示pdf的问题 npm install pdfh5 npm install canvas2.8.0 --ignore-scripts npm install --save dommatrix npm install --save web-streams-polyfill解决excel和docx预览的问题 npm install vue-office/docx vue-demi0.14.6 npm inst…...

性能之巅:Go语言优化深度探索

引言 在Go语言中进行性能优化是一个涉及多方面的工作&#xff0c;它涵盖代码编写、编译器优化、运行时系统调优以及对应用程序的深入理解。以下是一些关键点&#xff0c;包括性能分析工具、内存管理、并发优化等方面的内容&#xff0c;并附带了简单案例源代码。 性能分析工具…...

react + antd desgin 使用form功能时upload,radio,checkbox不能回显的问题

最近使用react开发 遇到form回显的问题 &#xff0c;处理upload回显的问题&#xff0c;提示 react-refresh:160 Warning: [antd: Upload] value is not a valid prop, do you mean fileList? 查看文档后&#xff0c;在form.item 组件下有一个特殊属性 valuePropName 子节点的值…...

【08】MySQL复杂查询:子查询语句详解与示例

文章目录 一、子查询的基本概念子查询的基本结构子查询的类型 二、标量子查询示例 1&#xff1a;标量子查询示例 2&#xff1a;标量子查询与IN组合 三、多行子查询示例 1&#xff1a;多行子查询与IN示例 2&#xff1a;多行子查询与ANY 四、多列子查询示例 1&#xff1a;多列子查…...

Unity 相机旋转及角度限制

前言 由于欧拉角具有直观的可读性&#xff0c;做相机旋转时选择修改eulerAngles 来实现旋转&#xff0c;但实际效果与预期稍有不同&#xff0c;这是因为欧拉角受到万向锁&#xff08;Gimbal Lock&#xff09;的影响&#xff0c;在赋值时需要对输入的角度进行调整。 if (value…...

error=‘null‘], commandType=io.lettuce.core.RedisPublisher$SubscriptionCommand]

问题 查看java应用启动日志输出下面错误&#xff1a; errornull], commandTypeio.lettuce.core.RedisPublisher$SubscriptionCommand] Completing command LatencyMeteredCommand [typeINFO, outputStatusOutput [output# Server redis_version:4.0.14 redis_git_sha1:000…...

Golang 字符串字面量表示方法

文章目录 1.普通字符串字面量&#xff08;Double-Quoted String Literals&#xff09;2.原始字符串字面量&#xff08;Raw String Literals&#xff09;3.字节字符串字面量&#xff08;Byte Slice Literals&#xff09;4.码值表示字符串字面量Unicode 转义序列UTF8 转义序列十六…...

03_Webpack模块打包工具

03_Webpack模块打包工具 目录 知识点自测 以下哪个选项是 ECMAScript 默认导出和导入的语法&#xff1f; A&#xff1a;export 和 require B&#xff1a;module.exports {} 和 import 变量名 C&#xff1a;export default 和 import 变量名 D&#xff1a;export 和 import {…...

【目标跟踪】AntiUAV600数据集详细介绍

AntiUAV600数据集的提出是为了适应真实场景&#xff0c;即无人机可能会随时随地出现和消失。目前提出的Anti-UAV任务都只是将其看做与跟踪其他目标一样的任务&#xff0c;没有结合现实情况考虑。 论文链接&#xff1a;https://arxiv.org/pdf/2306.15767https://arxiv.org/pdf/…...

十、JavaScript的应用的习题

题目一 在网页中显示一个工作中的 “ 数字时钟 ”&#xff0c;如图所示 运行效果 代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>动态时钟</title><style>.all{width: 660px;height: 350px;margin: 60p…...

【Spring】AOP

AOP&#xff08;Aspect Oriented Programming&#xff0c;面向切面编程&#xff09;是一种编程范式&#xff0c;用来帮助开发者更好地组织程序结构。它的主要作用是为现有功能添加增强&#xff0c;而不需要修改原始代码。这与 Spring 框架提倡的“无侵入式编程”相符&#xff0…...

三维地图,智慧城市,商业智能BI,数据可视化大屏(Cesiumjs/UE)

绘图工具 三维地图&#xff1a;Cesiumjs 建模方式&#xff1a;激光点云建模、航拍倾斜摄影建模、GIS建模、BIM建模、手工建模 建模工具&#xff1a;C4D Blender GeoBuilding ArcGIS Cesiumjs <!DOCTYPE html> <html lang"en"> <head><meta …...

鸿蒙Next通过oss上传照片到阿里云

前言 最近在写纯血鸿蒙的APP&#xff0c;需要用到oss上传照片&#xff0c;之前的客户端 Android 和 IOS 都已经实现了&#xff0c;获取的阿里云签名的上传地址是服务端实现的&#xff0c;相信大部分公司都是这样的模式&#xff0c;服务端也是调用阿里云的SDK来实现的&#xff…...

小白爬虫——selenium入门超详细教程

目录 一、selenium简介 二、环境安装 2.1、安装Selenium 2.2、浏览器驱动安装 三、基本操作 3.1、对页面进行操作 3.1.1、初始化webdriver 3.1.2、打开网页 3.1.3、页面操作 3.1.4、页面数据提取 3.1.5、关闭页面 3.1.6、综合小案例 3.2、对页面元素进行操作 3.2.…...

nlp培训重点

1. SGD梯度下降公式 当梯度大于0时&#xff0c;变小&#xff0c;往左边找梯度接近0的值。 当梯度小于0时&#xff0c;减去一个负数会变大&#xff0c;往右边找梯度接近0的值&#xff0c;此时梯度从负数到0上升 2.Adam优化器实现原理 #coding:utf8import torch import torch.n…...

什么是多模态和模态

文章目录 前言一、定义1. 模态 (Modal)2. 非模态 (Non-modal) 二、GUI中1. 模态&#xff08;Modal&#xff09;对话框2. 非模态&#xff08;Modeless&#xff09;对话框 三、模态 vs 非模态 的对比四、何时使用模态和非模态对话框&#xff1f;五、Qt 中 exec() 与 show() 的区别…...

apache中的Worker 和 Prefork 之间的区别是什么?

文章目录 内存使用稳定性兼容性适用场景 Apache中的Worker和Prefork两种工作模式在内存使用、稳定性以及兼容性等方面存在区别 内存使用 Worker&#xff1a;由于使用线程&#xff0c;内存占用较少。Prefork&#xff1a;每个进程独立运行&#xff0c;内存消耗较大。 稳定性 W…...

系统监控——分布式链路追踪系统

摘要 本文深入探讨了分布式链路追踪系统的必要性与实施细节。随着软件架构的复杂化&#xff0c;传统的日志分析方法已不足以应对问题定位的需求。文章首先解释了链路追踪的基本概念&#xff0c;如Trace和Span&#xff0c;并讨论了其基本原理。接着&#xff0c;文章介绍了SkyWa…...

【Python]深入Python日志管理:从logging到分布式日志追踪的完整指南

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 日志是软件开发中的核心部分,尤其在分布式系统中,日志对于调试和问题定位至关重要。本篇文章将从Python标准库的logging模块出发,逐步探讨日志管理的最佳实践,涵盖日志配置、日志分层、日志格式化等基…...

DHCP Client的工作方式

【运作方式】 一开始Client没有IP资料 DHCPDISCOVER Client发出DHCPDISCOVER广播封包&#xff08;UDP port 67&#xff09;&#xff0c;寻找DHCP Server。 DHCPOFFER Client开始监听UDP port 68 &#xff08;任何&#xff09;DHCP Server收到DHCPDISCOVER封包后&#xff…...

docker-常用应用部署dockerfile模板

文章目录 概述Springboot-Djava.security.egdfile:/dev/./urandom参数说明 vue应用部署nginx.conf配置Dockerfile 概述 本文列举了Java开发中常用如SpringBoot、Vue前端等类型的应用Docker部署所需的DockerFile Springboot FROM anapsix/alpine-java:8_server-jre_unlimited…...

Unity3D学习FPS游戏(13)玩家血量控制

玩家血量控制 血条UI玩家Canvas下的Slider血量逻辑控制 子弹攻击掉血子弹发射者的区分玩家受伤逻辑子弹碰撞检测 效果 血条UI 和之前我们前面介绍的玩家武器弹夹UI的思路是一样的&#xff0c;跟详细的细节可以参考博客Unity3D装弹和弹夹UI显示。 玩家Canvas下的Slider 之前玩…...

TDesign:Switch开关

Switch 开关 文档地址 view TDSwitch(isOn: controller.isDefault, // 默认是否开启状态trackOnColor: AppColors.mainColor,onChanged: ((bool value){controller.onTapSwitch(value);return value;}), ),controller bool isDefault true; // 是否默认 void onTapSwitch(bool…...

AI在SEO中的应用与关键词优化探讨

内容概要 在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;技术为搜索引擎优化&#xff08;SEO&#xff09;带来了革命性的改变。传统的SEO主要依赖于人为的经验和判断&#xff0c;而AI则通过算法分析海量数据&#xff0c;提供更加精准和高效的方式优化关键词…...

[docker中首次配置git环境与时间同步问题]

11月没写东西&#xff0c;12月初赶紧水一篇。 刚开始搭建docker服务器时&#xff0c;网上找一堆指令配置好git后&#xff0c;再次新建容器后忘记怎么配了&#xff0c;&#xff0c;这次记录下。 一、git ssh指令法&#xff0c;该方法不用每次提交时输入密码 前期准备&#xff0…...

使用lumerical脚本语言创建绘制波导并进行数据分析(纯代码实现)(1)

使用lumerical脚本语言创建绘制波导、配置二维模式求解器、计算模式轮廓、计算有效折射率(neff)和群折射率(ng)随波长的变化关系、计算有效折射率(neff)随波导宽度的变化关系及针对有效折射率法进行相关数据处理(代码均有注释详解)。 一、绘制波导结构 1.1 代码实现 w…...

redis.conf

tracking-table-max-keys tracking-table-max-keys 是 Redis 中的一个配置选项&#xff0c;它与 Key Tracking 功能有关。Key Tracking 是 Redis 6.0 引入的一项功能&#xff0c;用于追踪哪些键在被客户端操作时发生了变化。 tracking-table-max-keys 的作用&#xff1a; 该配置…...

泷羽sec学习打卡-shell命令8

声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都 与本人无关,切莫逾越法律红线,否则后果自负 关于shell的那些事儿-shell8 until循环(直到为止)case语句func函数定义实践是检验真理的唯一标准 别问&…...

割草机器人架构设计和技术应用

题目&#xff1a;割草机器人项目的系统架构设计与技术应用 摘要&#xff1a; 随着智能家居和自动化技术的发展&#xff0c;割草机器人作为一种便捷的园艺工具逐渐进入市场。本论文以我参与管理和开发的割草机器人项目为例&#xff0c;详细阐述了项目中采用的关键技术、系统架…...