【网络运维】Linux:SELinux简介和配置

SELinux 介绍

SELinux 概述

文件权限控制了哪些用户或用户组可以访问哪些特定文件,但未限定用户访问文件的方式。

例如:对于文件的写入权限而言, 结构化数据文件是否应当设计为只能使用特定的程序写入,但其他编辑器仍可以打开和修改此文件,而这可能会导致损坏。文件权限仅仅是控制谁可以读取、写入或运行文件,无法控制如何使用文件。

Security Enhanced Linux (SELinux)是一个额外的系统安全层,主要目标是防止已遭泄露的系统服务访问用户数据。

例如:恶意人员成功入侵了 Web服务器进程,获得进程的权限,也就是apache用户和apache组的权限。该用户和组对文档根目录/var/www/html具有读取权限,还可以访问/tmp和/var/tmp,以及全局可写的其他任何文件和目录。

SELinux 强制执行一组访问规则,明确定义进程和资源之间允许的操作。每个进程、文件、目录和端口都具有专门的安全标签, 称为SELinux上下文。上下文是一个名称, SELinux策略使用它来确定某个进程能否访问文件、目录或端口。除非显式规则授予访问权限,否则,在默认情况下,策略不允许任何交互。

SELinux 标签有多个内容:用户,角色,类型和敏感度。rhel中默认策略targeted,基于类型部分。类型部分通常以_t结尾。
在这里插入图片描述
示例:

  • web 服务器守护进程类型是 httpd_exec_t
  • web 服务器的网页类型是 httpd_sys_content_t
  • web 服务器的端口类型是 http_port_t
  • /tmp 标签 tmp_t
基本原理
  • SELinux默认策略允许apache进程访问在/var/www/html文件夹下的文件和文件夹,以及其他一些具有httpd_sys_content_t上下文的文件夹,禁止访问具有其他不匹配标签的目录。
  • 在 SELinux 的保护下,apache进程不允许访问/tmp和/var/tmp目录。因为/tmp、/var/tmp目录的标签是tmp_t,与默认策略不匹配。
命令选项 -Z

许多处理文件的命令都一个-Z 选项,用于显示和设置SELinux上下文。

[root@server ~]# ps -C sshd -Z
LABEL                               PID TTY          TIME CMD
system_u:system_r:sshd_t:s0-s0:c0.c1023 951 ?    00:00:00 sshd
system_u:system_r:sshd_t:s0-s0:c0.c1023 1261 ?   00:00:00 sshd
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 1276 ? 00:00:00 sshd
system_u:system_r:sshd_t:s0-s0:c0.c1023 2455 ?   00:00:00 sshd
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 2459 ? 00:00:00 sshd[root@server ~]# ls -Z /home
unconfined_u:object_r:user_home_dir_t:s0 furongwang# 其他命令中 -Z 选项
# cp -Z     set SELinux security context of destination file to default type
# mkdir -Z     set SELinux security context of each created directory to the default type
SELinux 模式
  • enforcing 模式: SELinux强制执行访问控制规则。 在强制模式下,如果规则没有明确允许访问,则拒绝访问,并写入日志。此模式是默认模式。
  • Permissive 模式:SELinux 加载策略并处于活动状态,但不强制执行访问控制规则,⽽是记录访问违规。此模式有助于对应用和规则进行测试和故障排除。
  • disable 模式:完全关闭 SELinux。不拒绝任何SELinux违规,不予记录。

查看当前模式

[root@server ~]# getenforce 

更改当前模式

[root@server ~]# setenforce 
usage:  setenforce [ Enforcing | Permissive | 1 | 0 ]# 强制模式临时切换为允许模式
[root@server ~]# setenforce 0
# 或者
[root@server ~]# setenforce Permissive# 允许模式临时切换为强制模式
[root@server ~]# setenforce 1
# 或者
[root@server ~]# setenforce Enforcing

模式切换注意事项:

  • 强制模式和允许模式之间变更,不需要重启系统。
  • 从强制模式或者允许模式变更到禁用模式,或者从禁用模式变更到强制模式或者允许模式都需要重启系统。

更改 SELinux 默认模式

[root@server ~]# vim /etc/selinux/config
SELINUX=enforcing
SELINUXTYPE=targeted

在启动时通过将向内核传递参数来设置SELinux 模式

  • enforcing=1,设置强制模式。
  • enforcing=0,设置许可模式。
  • selinux=0,来彻底禁用 SELinux。
  • selinux=1,启用 SELinux(当设置enforcing参数是,该参数可以省略)。

实验: selinux模式为enforcing情况下,破解root密码。破解完成后不执行 touch /.autorelabel命令。

重启测试:使用正确的密码登录。结果:登录失败。原因:用户验证程序无法访问/etc/shadow,因为破解密码过程中/etc/shadow文件标签被破坏了。

处理方法:系统启动时,内核添加参数 selinux=1 enforcing=0

控制文件 SELinux 上下文

新文件默认 SELinux 上下文

新文件通常从父目录继承其SELinux上下文,从而确保它们具有适当的上下文。

[root@server ~]# touch /tmp/ruike1
[root@server ~]# ls -dZ /tmp /tmp/ruike1 
drwxrwxrwt. root root system_u:object_r:tmp_t:s0       /tmp
-rw-r--r--. root root unconfined_u:object_r:user_tmp_t:s0 /tmp/ruike1[root@server ~]# cp /tmp/ruike1 /root/ruike5
[root@server ~]# ls -dZ /tmp /tmp/ruike1 /root /root/ruike5 
dr-xr-x---. root root system_u:object_r:admin_home_t:s0 /root
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 /root/ruike5
drwxrwxrwt. root root system_u:object_r:tmp_t:s0       /tmp
-rw-r--r--. root root unconfined_u:object_r:user_tmp_t:s0 /tmp/ruike1

以下两种情况,文件的 SELinux 上下文保持不变:

  • cp -a 命令复制
  • 移动文件
[root@server ~]# cp -a /tmp/ruike1 /root/ruike1-a
[root@server ~]# ls -dZ /tmp /tmp/ruike1 /root /root/ruike1* 
dr-xr-x---. root root system_u:object_r:admin_home_t:s0 /root
-rw-r--r--. root root unconfined_u:object_r:user_tmp_t:s0 /root/ruike1-a
drwxrwxrwt. root root system_u:object_r:tmp_t:s0       /tmp
-rw-r--r--. root root unconfined_u:object_r:user_tmp_t:s0 /tmp/ruike1[root@server ~]# mv /tmp/furongwang /root/furongwang-mv
[root@server ~ ]# ls -1dZ /tmp /root /root/furongwang*system_u:object_r:admin_home_t:s0 /root
unconfined_u:object_r:admin_home_t:s0 /root/furongwang1unconfined_u:object_r:user_tmp_t:s0 /root/furongwang-aunconfined_u:object_r:user_tmp_t:s0 /root/furongwang-mvsystem_u:object_r:tmp_t:s0 /tmp
设置文件 SELinux 上下文

设置文件上下文命令

  • chcon 命令,直接更改文件SELinux上下文。但是,它不会将上下文更改保存到 SELinux 上下文数据库中。系统下一次对所有文件进行 relabel 操作时,将导致该上下文恢复。它对于测试和实验很有用。

  • restorecon 命令,根据 SELinux上下文数据库中规则,恢复文件SELinux上下文。原先通过 chcon命令所做的更改,将失效。

示例:

[root@server ~]# mkdir /www
[root@server ~]# ls -Zd /www
unconfined_u:object_r:default_t:s0 /www[root@server ~]# chcon -t httpd_sys_content_t /www
[root@server ~]# ls -Zd /www
unconfined_u:object_r:httpd_sys_content_t:s0 /www[root@server ~]# restorecon -v /www
Relabeled /www from unconfined_u:object_r:httpd_sys_content_t:s0 to unconfined_u:object_r:default_t:s0
[root@server ~]# ls -Zd /www
unconfined_u:object_r:default_t:s0 /www

semanage fcontext 命令用于管理SELinux上下文数据库中规则,restorecon 命令根据这些规则恢复文件上下文。semanage fcontext命令使用扩展的正则表达式指定路径和文件名。比较常见的扩展正则表达式 (/.*)? ,表示随意匹配/后面接任意数量字符,递归匹配文件夹下的子文件和子文件夹。

示例:

[root@server ~]# echo Hello World > /www/index.html
[root@server ~]# ls -Zd /www/index.html
unconfined_u:object_r:default_t:s0 /www/index.html# 安装 semanage 工具
[root@server ~]# yum install -y policycoreutils-python# 添加默认规则
[root@server ~]# semanage fcontext -a -t httpd_sys_content_t '/www(/.*)?'
[root@server ~]# semanage fcontext -l |grep '^/www(/.*)?'
/www(/.*)?    all files   system_u:object_r:httpd_sys_content_t:s0 # 只查看非默认策略
[root@server ~]# semanage fcontext -lC
SELinux fcontext  type      Context
/www(/.*)?     all files    system_u:object_r:httpd_sys_content_t:s0# 恢复文件上下文
[root@server ~]# restorecon -Rv /www/
Relabeled /www from unconfined_u:object_r:default_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
Relabeled /www/index.html from unconfined_u:object_r:default_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
[root@server ~]# ls -1Zd /www/ /www/index.html
unconfined_u:object_r:httpd_sys_content_t:s0 /www/
unconfined_u:object_r:httpd_sys_content_t:s0 /www/index.html# 删除默认规则
[root@server ~]# semanage fcontext -d -t httpd_sys_content_t '/www(/.*)?'# 删除目录
[root@server ~]# rm -fr /www
示例:配置 web 站点主目录
# 准备目录
[root@server ~]# mkdir /www
[root@server ~]# echo woshichuantongpai > /www/index.html
[root@server ~]# semanage fcontext -a -t httpd_sys_content_t '/www(/.*)?'
[root@server ~]# restorecon -Rv /www/# 安装 httpd
[root@server ~]# yum install -y httpd
[root@server ~]# systemctl enable httpd --now
[root@server ~]# vim /etc/httpd/conf/httpd.conf 
# 注释122 行DocumentRoot,在122行后,添加如下内容:
# DocumentRoot "/var/www/html"
DocumentRoot "/www"
<Directory "/www">AllowOverride None# Allow open access:Require all granted
</Directory>
# 重启服务
[root@server ~]# systemctl restart httpd# 访问验证
[root@server ~]# curl http://server.furongwang.cloud/
woshichuantongpai

控制端口 SELinux 上下文

端口 SELinux 上下文

SELinux还可以对端口标记。 当某个进程希望侦听端口时, SELinux将检查是否允许与该进程相关联的标签绑定该端口标签。 这可以阻止恶意服务控制本应由其他网络服务使用的端口。

在 targeted 策略中:

  • 端口 22/TCP ,具有标签 ssh_port_t
  • 端口 80/TCP 和 443/TCP ,具有标签 http_port_t
# 查看端口标记
[root@server ~]# semanage port -l | grep http_port_t
http_port_t                    tcp      80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t            tcp      5988# 添加端口标记
[root@server ~]# semanage port -a -t http_port_t -p tcp 18020
[root@server ~]# semanage port -l|grep 18020
http_port_t                    tcp      18020, 80, 81, 443, 488, 8008, 8009, 8443, 9000# 修改网络端口标记
[root@server ~]# semanage port -m -t ssh_port_t -p tcp 18020
[root@server ~]# semanage port -l | grep 18020
ssh_port_t                     tcp      18020, 22# 删除端口标记
[root@server ~]# semanage port -d -t ssh_port_t -p tcp 18020
[root@server ~]# semanage port -l | grep 18020
示例:配置 web 站点监听端口
[root@server ~]# vim /etc/httpd/conf/httpd.conf
# 修改原先的 Listen 80 为 Listen 18020
Listen 18020# 重启服务
[root@server ~]# systemctl restart httpd
Job for httpd.service failed because the control process exited with error code.
See "systemctl status httpd.service" and "journalctl -xe" for details[root@server ~]# systemctl status httpd.service |cat |grep Per
......
Nov 29 11:55:26 server.furongwang.cloud httpd[3939]: (13)Permission denied: AH00072: make_sock: could not bind to address 0.0.0.0:18020
......# 配置端口
[root@server ~]# semanage port -a -t http_port_t -p tcp 18020
[root@server ~]# semanage port -l | grep 18020
http_port_t                    tcp      18020, 80, 81, 443, 488, 8008, 8009, 8443, 9000# 只查看改动标签
[root@server ~]# semanage port -lC
SELinux Port Type              Proto    Port Number
http_port_t                    tcp      18020# 重启服务并访问
[root@server ~]# systemctl restart httpd# 访问验证
[root@server ~]# curl http://server.furongwang.cloud:18020/
Hello World

控制 SELinux 布尔值

SELinux 布尔值

SELinux 布尔值是可更改SELinux策略行为的开关,可以启用和禁用。

# 查看SELinux布尔值
[root@server ~]# getsebool -a |grep httpd_enable_homedirs
httpd_enable_homedirs --> off
[root@server ~]# getsebool httpd_enable_homedirs
httpd_enable_homedirs --> off# 设置SELinux布尔值
[root@server ~]# setsebool 
Usage:  setsebool [ -NPV ] boolean value | bool1=val1 bool2=val2...
# 启用value为1或者on或者true
# 禁用value为0或者off或者false[root@server ~]# setsebool httpd_enable_homedirs=1或者on或者true
[root@server ~]# setsebool httpd_enable_homedirs=0或者off或者false# 持久化设置布尔值,使用-P选项修改将写入SELinux数据库。
[root@server ~]# setsebool httpd_enable_homedirs=1
[root@server ~]# setsebool -P httpd_enable_homedirs=1

还可以semanage boolean 命令管理 SELinux 布尔值。

[root@server ~]# semanage boolean 
usage: semanage boolean [-h] [-n] [-N] [-S STORE] [  --extract  | --deleteall  | --list -C | --modify ( --on | --off ) boolean ]# 查看 SELinux 布尔值
[root@server ~]# semanage boolean -l
# 只查看非默认的 SELinux 布尔值
[root@server ~]# semanage boolean -l -C# 设置 SELinux 布尔值
[root@server ~]# semanage boolean -m -1|--on use_nfs_home_dirs
[root@server ~]# semanage boolean -m -0|--off use_nfs_home_dirs
# 相当于setsebool -P# 删除原先自定义的 SELinux 布尔值
[root@server ~]# semanage boolean -D
示例:允许 httpd 访问用户家目录
[root@server ~]# vim /etc/httpd/conf.d/userdir.conf
# 修改以下两个参数UserDir enabledUserDir public_html
# 重启服务
[root@server ~]# systemctl restart httpd# 设置权限
[furongwang@server ~]$ mkdir public_html
[furongwang@server ~]$ echo "Welcome to litang" > public_html/index.html
[root@server ~]# ll -d /home/furongwang
drwx-----x. 2 furongwang furongwang 83 81 16:20 /home/furongwan
[furongwang@server ~]$ chmod o+x /home/furongwang/# 未启用布尔值访问
[root@server ~]# curl http://server.furongwang.cloud:18020/~furongwang/
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access this resource.</p>
</body></html># 启用布尔值访问
[root@server ~]# setsebool httpd_enable_homedirs=1
[root@server ~]# curl http://server.furongwang.cloud:18020/~furongwang/
Welcome to litang
SELinux 问题处理思路
  1. 确定是否是 SELinux 引起的。
  2. 在做调整前,首先考虑 SELinux 是否正确的阻止了访问。例如web服务器尝试访问/home目录,如果web的内容不是用户发布的,那么发生阻止信号是正确的阻止。如果这个访问是被允许的,参考下面步骤。
  3. 最常见的 SELinux 问题是不正确的文件上下文。当文件是另外一个地方创建的,然后移动到新的地方,而新的地方需要新的上下文。在大多数情况,执行restorecon可以修复这个问题。这种修复问题方式对系统其他部分安全影响非常小。
  4. 另外一个问题可能是布尔值设置不当导致拒绝访问。例如ftpd_anon_write布尔值控制匿名ftp用户是否可以上传文件。如果如需匿名用户上传文件,需要打开这个布尔值。调整布尔值需要小心,因为对系统影响范围比较大。
  5. 还有可能是 端口上下文不匹配。
  6. 还有可能是 SELinux bug。

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

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

相关文章

GaussDB SQL执行计划详解

1 问题现象SQL执行计划是GaussDB性能分析及调优的核心&#xff0c;它输出三个关键信息&#xff1a;访问路径:扫描表数据的路径。连接顺序&#xff1a;多表连接顺序。连接方式&#xff1a;多表连接方式。2 技术背景GaussDB SQL语句执行计划是数据库为运行SQL语句而执行的操作步骤…

02.【数据结构-C语言】顺序表(线性表概念、顺序表实现:增删查、前向声明、顺序表实现通讯录项目:增删改查、通讯录数据导入及保存到本地文件)

目录 1. 线性表 2. 顺序表概念及分类 2.1 顺序表的概念 2.2 顺序表分类 2.3 动静态顺序表对比 3. 顺序表的实现&#xff08;附完整版代码&#xff09; 3.1 顺序表结构体声明 3.2 初始化&销毁 3.3 插入&#xff08;尾插、头插、指定位置之前插入&#xff09; 3.4 …

MyBatis核心配置深度解析:从XML到映射的完整技术指南

&#x1f527; MyBatis核心配置深度解析&#xff1a;从XML到映射的完整技术指南 &#x1f680; 引言&#xff1a;MyBatis作为Java生态中最受欢迎的持久层框架之一&#xff0c;其强大的配置体系是实现灵活数据访问的核心。本文将深入解析MyBatis的配置文件架构、映射机制以及高级…

OpenCV HSV与RGB颜色模型的区别

HSV与RGB颜色模型的区别 HSV&#xff08;Hue, Saturation, Value&#xff09;和 RGB&#xff08;Red, Green, Blue&#xff09;是两种不同的颜色表示方式&#xff0c;主要区别如下&#xff1a;对比项RGBHSV定义基于红、绿、蓝三原色的混合基于色相&#xff08;H&#xff09;、饱…

具有柔性关节的机械臂matlab仿真

柔性关节机械臂MATLAB仿真方案&#xff0c;包含动力学建模、控制器设计和可视化分析。该方案基于拉格朗日方程建立柔性关节模型&#xff0c;并实现了PD控制、滑模控制和自适应控制三种控制策略。 MATLAB仿真 %% 柔性关节机械臂仿真 - 完整系统 % 作者: MATLAB技术助手 % 日期: …

数据结构—队列和栈

1.二级指针的使用二级指针&#xff1a; 1. 在被调函数中&#xff0c;想要修改主调函数中的指针变量&#xff0c;需要传递该指针变量的地址&#xff0c;形参用二级指针接收。 2.指针数组的数组名是一个二级指针&#xff0c;指针数组的数组名作为参数传递时&#xff0c;可用二级指…

均线:从市场脉搏到量子计算的时空密码

一部跨越百年的技术分析进化史,揭示金融市场的数学本质 引言:金融市场的永恒罗盘 在华尔街百年风云中,一个简单的数学工具始终闪耀着智慧光芒——移动平均线(Moving Average)。从杰西利弗莫尔的手绘图表到文艺复兴科技的量子模型,均线系统完成了从经验工具到科学框架的惊…

Python 通过Playwright+OpenCV破解滑动验证码 实例

由于公司最近需要对接某业务系统&#xff0c;涉及到部分数据需要提交至其它平台业务系统&#xff0c;只有其它平台账户&#xff0c;没有接口&#xff0c;因此做此开发。首先通过OpenCV计算出验证验证码滑块距离&#xff0c;根据距离&#xff0c;使用 Playwright 利用滑动距离模…

山东省天地图API申请并加载到QGIS和ArcGIS Pro中

目的&#xff1a;在QGIS/ArcGIS Pro中加载山东省不同时期的历史影像1、申请API 山东省天地图的API和国家天地图的API不通用&#xff0c;需要单独申请。 https://shandong.tianditu.gov.cn/ 打开本地服务资源找到影像的详情页 点击申请地址按照下面的步骤一步一步来&#xff0c;…

qt窗口--02

文章目录qt窗口--02QMessageBoxQColorDialogQFileDialogQFontDialogQInputDialog、结语很高兴和大家见面&#xff0c;给生活加点impetus&#xff01;&#xff01;开启今天的编程之路&#xff01;&#xff01; 作者&#xff1a;٩( ‘ω’ )و260 我的专栏&#xff1a;qt&#…

Linux seLinux

Linux seLinux 1、什么是selinux&#xff0c;security enhanced linux–安全加强的linux。 是由美国国家安全局开发的以及历史。selinux之前是基于自主存取控制方法DAC&#xff0c; 只要符合权限即可&#xff0c;通过suid和sgid特殊权限存在有一定的安全隐患&#xff0c; 甚至一…

Linux: NFS 服务部署与autofs自动挂载的配置

Linux&#xff1a; NFS 服务部署与autofs自动挂载的配置NFS&#xff08;Network File System&#xff0c;网络文件系统&#xff09;是一种基于 TCP/IP 协议的网络文件共享协议&#xff0c;允许不同主机在网络中共享文件资源&#xff0c;实现跨主机的文件访问与管理&#xff0c;…

【深度学习②】| DNN篇

0 序言 本文将系统介绍基于PyTorch的深度神经网络&#xff08;DNN&#xff09;相关知识&#xff0c;包括张量的基础操作、DNN的工作原理、实现流程&#xff0c;以及批量梯度下降、小批量梯度下降方法和手写数字识别案例。通过学习&#xff0c;你将掌握DNN的核心概念、PyTorch实…

Xcode 26 如何在创建的 App 包中添加特定的目录

功能需求 在某些情况下,我们需要将特定文件放在 Xcode 编译链接后 App 包里的指定目录中,比如将 AI 大模型相关文件放在它们对应名称的目录中: 正常情况下,Xcode 会将项目目录中的所有文件都平铺放到 App 包的根目录里。那么,要如何形成上面这种文件目录层级呢? 在本篇…

linux-系统性能监控

linux-系统性能监控一、cpu1.1 查看cpu的信息1.2 cpu性能指标1.3 编写监控cpu使用率的脚本1.4 查找出使用cpu最高的10个进程二、内存2.1 查看内存信息2.2 交换&#xff08;swap&#xff09;分区2.2.1 查看交换分区的积极程度2.2.2 查看交换分区的大小2.2.3 管理交换分区2.3 编写…

AgxOrin平台JetPack5.x版本fix multi-cam race condition 补丁

本文包含三个针对NVIDIA Linux驱动程序的补丁修复: 多摄像头竞争条件修复 在capture-ivc驱动中新增信号量机制,解决多摄像头同时操作时的竞争条件问题(Bug 4425972)。主要修改包括在通道上下文结构中添加信号量,并在通道ID通知和取消注册时进行信号量操作。 内存泄漏修复…

【Go】P3 Go语言程序结构

Go语言程序结构Go语言程序结构命名规则与编程惯例核心规则四种声明语句详解var声明&#xff1a;变量声明const声明&#xff1a;常量声明type声明&#xff1a;类型定义func声明&#xff1a;函数声明简短变量声明(:)使用规则和限制指针&#xff1a;安全的内存地址操作基本概念和操…

【机器学习深度学习】知识蒸馏实战:让小模型拥有大模型的智慧

目录 引言&#xff1a;模型压缩的迫切需求 一、知识蒸馏的核心原理 1.1 教师-学生模式 1.2 软目标&#xff1a;知识传递的关键 1.3 蒸馏损失函数 二、实战&#xff1a;Qwen模型蒸馏实现 2.1 环境配置与模型加载 2.2 蒸馏损失函数实现 2.3 蒸馏训练流程 2.4 训练优化技…

基于MCP提示构建工作流程自动化的实践指南

引言 在现代工作和生活中&#xff0c;我们经常被各种重复性任务所困扰——从每周的膳食计划到代码审查反馈&#xff0c;从文档更新到报告生成。这些任务虽然不复杂&#xff0c;却消耗了大量宝贵时间。MCP&#xff08;Model Context Protocol&#xff09;提示技术为解决这一问题…

apache-tomcat-11.0.9安装及环境变量配置

一、安装从官网上下载apache-tomcat-11.0.9,可以下载exe可执行文件版本&#xff0c;也可以下载zip版本&#xff0c;本文中下载的是zip版本。将下载的文件解压到指定目录&#xff1b;打开tomcat安装目录下“\conf\tomcat-users.xml”文件&#xff1b;输入以下代码&#xff0c;pa…