Linux学习-93-SELinux安全上下文操作

news2025/1/21 7:22:57

18.6 SELinux安全上下文查看方法

  • SELinux 管理过程中,进程是否可以正确地访问文件资源,取决于它们的安全上下文。进程和文件都有自己的安全上下文,SELinux 会为进程和文件添加安全信息标签,比如 SELinux 用户、角色、类型、类别等,当运行 SELinux 后,所有这些信息都将作为访问控制的依据。查看文件和目录的安全上下文,执行命令如下:
[root@VM-0-3-centos lnmp1.9]# ll -Z /home/wwwroot/default                 
total 84                                                                  
-rw-r--r--.  1 root root unconfined_u:object_r:user_home_t:s0  3196 Nov  7
 21:30 index.html                                                         
-rw-r--r--.  1 root root unconfined_u:object_r:user_home_t:s0  5683 Nov  7
 21:30 lnmp.gif                                                           
-rw-r--r--.  1 root root unconfined_u:object_r:user_home_t:s0 20256 Nov  7
 21:30 ocp.php                                                            
-rw-r--r--.  1 root root unconfined_u:object_r:user_home_t:s0    20 Nov  7
 21:30 phpinfo.php                                                        
drwxr-xr-x. 14 www  www  unconfined_u:object_r:usr_t:s0        4096 Nov  7
 21:30 phpmyadmin                                                         
-rw-r--r--.  1 root root unconfined_u:object_r:user_home_t:s0 42621 Nov  7
 21:30 p.php 
...
  • 查看文件的安全上下文非常简单,就是使用“ll -Z”命令。而在此基础上,如果想要查看目录的安全上下文,需要添加“-d”选项,代表查看目录本身,而非目录下的子文件。举个例子:
[root@VM-0-3-centos lnmp1.9]# ll -Zd /home/wwwroot/default                
drwxr-xr-x. 3 www www unconfined_u:object_r:user_home_t:s0 4096 Nov  7 21:
30 /home/wwwroot/default  
  • 查看进程的安全上下文需使用 ps 命令即可。命令如下:
[root@VM-0-3-centos phpmyadmin]# ps -auxZ | grep nginx
system_u:system_r:unconfined_service_t:s0 root 314188 0.0  0.4 59984 8372 ?      Ss   Nov07   0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
system_u:system_r:unconfined_service_t:s0 www 314189 0.0  1.9 119260 34340 ?     S    Nov07   0:00 nginx: worker process
system_u:system_r:unconfined_service_t:s0 www 314190 0.0  1.8 119260 32924 ?     S    Nov07   0:00 nginx: worker process
...
  • 也就是说,只要进程和文件的安全上下文匹配,该进程就可以访问该文件资源。在上面的命令输出中,用:相间的列的就是安全上下文。

  • 安全上下文看起来比较复杂,它使用“:”分隔为 4 个字段,其实共有 5 个字段,只是最后一个“类别”字段是可选的,例如:

#身份字段:角色:类型:灵敏度:[类别]
  • 对这 5 个字段的作用进行说明。

1.身份字段(user):用于标识该数据被哪个身份所拥有,相当于权限中的用户身份。这个字段并没有特别的作用,知道就好。常见的身份类型有以下 3 种:

  1. - root:表示安全上下文的身份是 root。
  2. - system_u:表示系统用户身份,其中“_u”代表 user。
  3. - user_u:表示与一般用户账号相关的身份,其中“_u”代表 user。

user 字段只用于标识数据或进程被哪个身份所拥有,一般系统数据的 user 字段就是 system_u,而用户数据的 user 字段就是 user_u。SELinux 中可以识别多少用户身份字段,可以使用 seinfo 命令来进行查询。SELinux 的相关命令一般都是以“se”开头的,所以也较为好记。seinfo 命令格式如下:

[root@localhost ~]# seinfo [选项]
选项:
-u: 列出SELinux中所有的身份(user);
-r: 列出SELinux中所有的角色(role);
-t: 列出SELinux中所有的类型(type);
-b: 列出所有的布尔值(也就是策略中的具体规则名称);
-x: 显示更多的信息;

seinfo 命令的功能较多,我们在这里只想查询 SELinux 中的身份,那么只需执行如下命令:

[root@localhost ~]# seinfo -u
Users:9
sysadm_u
system_u
xguest_u
root
guest_u
staff_u
user_u
unconfined_u
git_shell_u

就可以看到 SELinux 中能够识别的 user 身份共有 9 种。不过这个字段在实际使用中并没有太多的作用。

  1. 角色(role):主要用来表示此数据是进程还是文件或目录。这个字段在实际使用中也不需要修改,所以了解就好。

常见的角色有以下两种:

  • - object_r:代表该数据是文件或目录,这里的“_r”代表 role。
  • - system_r:代表该数据是进程,这里的“_r”代表 role。

使用 seinfo 命令也可以查询SELinux 中有多少种角色:

[root@localhost ~]# seinfo -r
Roles:12
guest_r
staff_r
user_r
git_shell_r
logadm_r
object_r
sysadm_r
system_r
webadm_r
xguest_r
nx_server_r
unconfined_r

3.类型(type):类型字段是安全上下文中最重要的字段,进程是否可以访问文件,主要就是看进程的安全上下文类型字段是否和文件的安全上下文类型字段相匹配,如果匹配则可以访问。注意,类型字段在文件或目录的安全上下文中被称作类型(type),但是在进程的安全上下文中被称作域(domain)。也就是说,在主体(Subject)的安全上下文中,这个字段被称为域;在目标(Object)的安全上下文中,这个字段被称为类型。域和类型需要匹配(进程的类型要和文件的类型相匹配),才能正确访问。

SELinux 中到底有多少类型也是通过 seinfo 命令查询的,命令如下:

[root@localhost ~]# seinfo -t | more
Types:3488
#共有3488个类型
bluetooth_conf_t
cmirrord_exec_t
foghorn_exec_t
jacorb_port_t
sosreport_t
etc_runtime_t
user_home_t
unconfined_service_t
…省略部分输出…

知道了类型的作用,但怎么知道进程的域和文件的类型是否匹配呢?这就要查询具体的策略规则了。

nginx 进程可以访问/home/wwwroot/default/目录中的网页文件,所以 nginx 进程的域和/home/wwwroot/default/目录的类型应该是匹配的,我们查询一下,命令如下:

[root@VM-0-3-centos phpmyadmin]# ps -auxZ | grep nginx
system_u:system_r:unconfined_service_t:s0 root 314188 0.0  0.4 59984 8372 ?      Ss   Nov07   0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
system_u:system_r:unconfined_service_t:s0 www 314189 0.0  1.9 119260 34340 ?     S    Nov07   0:00 nginx: worker process
system_u:system_r:unconfined_service_t:s0 www 314190 0.0  1.8 119260 32924 ?     S    Nov07   0:00 nginx: worker process
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 root 453267 0.0  0.0 12140 1048 pts/1 S+ 13:44   0:00 grep --color=auto nginx
[root@VM-0-3-centos phpmyadmin]# ll -dZ /home/wwwroot/default
drwxr-xr-x. 3 www www unconfined_u:object_r:user_home_t:s0 4096 Nov  7 21:30 /home/wwwroot/default

  • nginx进程进程的域是 unconfined_service_t,/home/wwwroot/default目录的类型是user_home_t,这个主体的安全上下文类型经过策略规则的比对,是和目标的安全上下文类型匹配的,所以 nginx 进程可以访问user_home_t目录。

apache 进程可以访问 /var/www/html/(此目录为 RPM 包安装的 apache 的默认网页主目录)目录中的网页文件,所以 apache 进程的域和 /var/www/html/ 目录的类型应该是匹配的,我们查询一下,命令如下:

[root@localhost ~]# ps auxZ | grep httpd
unconfined_u:system_r:httpd_t:s0 root 25620 0.0 0.5 11188 3304 ? Ss
03:44 0:02 /usr/sbin/httpd
#apache进程的域是httpd_t
[root@localhost ~]# ls -dZ /var/www/html/
drwxr-xr-x.root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/
#/var/www/html/目录的类型是httpd_sys_content_t
  • apache 进程的域是 httpd_t,/var/www/html/ 目录的类型是 httpd_sys_content_t,这个主体的安全上下文类型经过策略规则的比对,是和目标的安全上下文类型匹配的,所以 apache 进程可以访问 /var/www/html/ 目录。

在 SELinux 中最常遇到的问题就是进程的域和文件的类型不匹配,所以要掌握如何修改类型字段。

4.灵敏度:灵敏度一般是用 s0、s1、s2 来命名的,数字代表灵敏度的分级。数值越大,代表灵敏度越高。

5.) 类别:类别字段不是必须有的,所以我们使用 ls 和 ps 命令查询的时候并没有看到类别字段。但是我们可以通过 seinfo 命令来查询,命令如下:

#查询所有的user字段,并查看详细信息
[root@localhost ~]# seinfo -u -x
#user字段名
system_u
#默认灵敏度
default level:s0
#灵敏度可以识别的类别
range:s0 - s0:c0.c1023
#该user能够匹配的role(角色)
roles:
object_r
system_r
unconfined_r

18.7 SELinux安全上下文的修改和设置(chcon和restorecon命令)

  • 安全上下文的修改是我们必须掌握的,主要是通过两个命令来实现的。chcon 命令格式如下:
[root@localhost ~]# chcon [选项] 文件或目录
  • 选项:

  • -R: 递归,当前目录和目录下的所有子文件同时设置;

  • -t: 修改安全上下文的类型字段,最常用;

  • -u: 修改安全上下文的身份字段;

  • -r: 修改安全上下文的角色字段;

#建立一个网页文件,并写入“test update page type!!”
[root@localhost ~]# echo'test update page type!!!' >> /home/wwwroot/default/pagetype.html
  • 通过浏览器查看这个网页,只需在浏览器的 URL 中输入“http://ip”即可。
    在这里插入图片描述
  • 分别查看nginx和这个页面文件的selinux类型;
[root@VM-0-3-centos phpmyadmin]# ps -auxZ | grep nginx
system_u:system_r:unconfined_service_t:s0 root 314188 0.0  0.4 59984 8372 ?      Ss   Nov07   0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
system_u:system_r:unconfined_service_t:s0 www 314189 0.0  1.9 119260 34340 ?     S    Nov07   0:00 nginx: worker process
system_u:system_r:unconfined_service_t:s0 www 314190 0.0  1.8 119260 32924 ?     S    Nov07   0:00 nginx: worker process
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 root 453267 0.0  0.0 12140 1048 pts/1 S+ 13:44   0:00 grep --color=auto nginx

[root@VM-0-3-centos phpmyadmin]# ll -dZ /home/wwwroot/default/pagetype.html
-rw-r--r--. 1 root root unconfined_u:object_r:user_home_t:s0 25 Nov  8 13:58 /home/wwwroot/default/pagetype.html
#这个网页文件的模式类别是user_home_t

#查询selinux中所有的类型、发现有一个类型叫var_t
[root@VM-0-3-centos ~]# seinfo -t | grep var_t
[root@VM-0-3-centos phpmyadmin]# chcon -t var_t /home/wwwroot/default/pagetype.html
#把网页文件的类型修改为var_t类型
[root@VM-0-3-centos phpmyadmin]# ll -dZ /home/wwwroot/default/pagetype.html
-rw-r--r--. 1 root root unconfined_u:object_r:var_t:s0 25 Nov  8 13:58 /home/wwwroot/default/pagetype.html
#这个网页的类型已经被修改了
  • 把网页文件的类型修改了,这样 nginx进程的安全上下文就不能匹配网页的安全上下文。这时网页就会提示权限拒绝,这里我们已经知道是安全上下文不匹配的问题。当然,我们可以通过 chcon 命令修改回来就可以修复。不过,我们还有一个命令 restorecon,这个命令的作用就是把文件的安全上下文恢复成默认的安全上下文。SELinux 的安全上下文设定非常完善,所以使用 restorecon 命令就可以修复安全上下文不匹配所引起的问题。restorecon 命令格式如下:
[root@localhost ~] # restorecon [选项】 文件或目录
  • 选项:
    • -R:递归.当前目录和目录下所有的子文件同时恢复;
    • -V:把恢复过程显示到屏幕上;

例如:

#将安全上下文从var_t恢复成了httpd_sys_content_t
[root@VM-0-3-centos phpmyadmin]# restorecon -vR  /home/wwwroot/default/pagetype.html
Relabeled /home/wwwroot/default/pagetype.html from unconfined_u:object_r:var_t:s0 to unconfined_u:object_r:user_home_t:s0
#查看一下,安全上下文已经恢复正常了.网页的访问也已经恢复正常了
[root@VM-0-3-centos phpmyadmin]# ll -dZ /home/wwwroot/default/pagetype.html
-rw-r--r--. 1 root root unconfined_u:object_r:user_home_t:s0 25 Nov  8 13:58 /home/wwwroot/default/pagetype.html

18.8 SELinux默认安全上下文的查询和修改(semanage命令)

  • restorecon 命令可以将文件或目录恢复成默认的安全上下文,这就说明每个文件和目录都有自己的默认安全上下文,事实也是如此,为了管理的便捷,系统给所有的系统默认文件和目录都定义了默认的安全上下文。使用 semanage 命令来查询和修改默认安全上下文
[root@localhost ~]# semanage [login|user|port|interface|fcontext|translation] -l
[root@localhost ~]# semanage fcontext [选项] [-first]  file_spec
  • fcontext 主要用于安全上下文方面,-l 是查询的意思。除此之外,此命令常用的一些选项及含义
选项含义
-a添加默认安全上下文配置。
-d删除指定的默认安全上下文。
-m修改指定的默认安全上下文。
-t设定默认安全上下文的类型
  • 查询默认安全上下文。
#查询所有的默认安全上下文
[root@VM-0-3-centos ~]# semanage fcontext -l |more
SELinux fcontext                                   type               Context

/                                                  directory          system_u:object_r:root_t:s
0 
/.*                                                all files          system_u:object_r:default_
t:s0 
/[^/]+                                             regular file       system_u:object_r:etc_runt
ime_t:s0 
/\.autofsck                                        regular file       system_u:object_r:etc_runt
ime_t:s0 
/\.autorelabel                                     regular file       system_u:object_r:etc_runt
ime_t:s0 
/\.ismount-test-file                               regular file       system_u:object_r:sosrepor
t_tmp_t:s0 
/\.journal                                         all files          <<None>>
/\.snapshots(/.*)?                                 all files          system_u:object_r:snapperd
_data_t:s0 
/\.suspended                                       regular file       system_u:object_r:etc_runt
ime_t:s0 
/a?quota\.(user|group)                             regular file       system_u:object_r:quota_db
_t:s0 
/afs                                               directory          system_u:object_r:mnt_t:s0
 
/bacula(/.*)?                                      all files          system_u:object_r:bacula_s
tore_t:s0 
/bin                                               all files          system_u:object_r:bin_t:s0
/home/[^/]+/((www)|(web)|(public_html))(/.*)?/\.htaccess regular file  unconfined_u:object_r:httpd_user_htaccess_t:s0 
/home/[^/]+/((www)|(web)|(public_html))(/.*)?/logs(/.*)? all files       unconfined_u:object_r:httpd_user_ra_content_t:s0 
/home/[^/]+/((www)|(web)|(public_html))(/.+)?      all files          unconfined_u:object_r:httpd_user_content_t:s0 
/home/[^/]+/((www)|(web)|(public_html))/cgi-bin(/.+)? all files          unconfined_u:object_r:httpd_user_script_exec_t:s0 
... 
--More--
  • 所以,一旦对上述这些目录或文件的安全上下文进行了修改,就可以使用 restorecon 命令进行恢复,因为默认安全上下文已经明确定义了。

  • 修改默认安全上下文。

#新建/www/目录,打算用这个目录作为nginx的网页主目录,而不再使用/home/wwwroot//目录
[root@VM-0-3-centos ~]# mkdir /www
#而这个目录的安全上下文类型是default_t,那么nginx进程当然就不能访问和使用/www/目录了
[root@VM-0-3-centos ~]# ll -Zd /www
drwxr-xr-x. 2 root root unconfined_u:object_r:default_t:s0 4096 Nov  9 17:50 /www
[root@VM-0-3-centos ~]# cp /home/wwwroot/default/pagetype.html /www
[root@VM-0-3-centos ~]# ll -Z /www/pagetype.html
-rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 25 Nov  9 17:52 /www/pagetype.html
  • 这时我们可以直接设置 /www/ 目录的安全上下文类型为 user_home_t,但是为了以后管理方便,修改 /www/ 目录的默认安全上下文类型。先查询一下 /www/ 目录的默认安全上下文类型,命令如下:
[root@VM-0-3-centos ~]# semanage fcontext -l | grep "/www"
#查询/www/目录的默认安全上下文

从结果中发现没有 /www/ 目录的默认安全上下文,因为这个目录是手工建立的,并不是系统默认目录,所以并没有默认安全上下文,需要我们手工设定。命令如下:

#这条命令会给/www/目录及目录下的所有内容设定默认安全上下文类型是user_home_t
[root@VM-0-3-centos ~]# semanage fcontext -a -t user_home_t '/www(/.*)?'
#/www/目录的默认安全上下文出现了
[root@VM-0-3-centos ~]# semanage fcontext -l | grep '/www(/.*)?'
/var/www(/.*)?                                     all files          system_u:object_r:httpd_sys_content_t:s0 
/var/www(/.*)?/logs(/.*)?                          all files          system_u:object_r:httpd_log_t:s0 
/www(/.*)?                                         all files          system_u:object_r:user_home_t:s0 
  • 这时已经设定好了 /www/ 目录的默认安全上下文。
#但是查询发现/www/目录的安全上下文并没有进行修改,那是因为我们只修改了默认安全上下文,而没有修改目录的当前安全上下文
[root@VM-0-3-centos ~]# ll -Zd /www
drwxr-xr-x. 2 root root unconfined_u:object_r:default_t:s0 4096 Nov  9 17:52 /www
#恢复一下/www/目录的默认安全上下文,发现类型已经被修改为user_home_t
[root@VM-0-3-centos ~]# restorecon -Rv /www/
Relabeled /www from unconfined_u:object_r:default_t:s0 to unconfined_u:object_r:user_home_t:s0
Relabeled /www/pagetype.html from unconfined_u:object_r:default_t:s0 to unconfined_u:object_r:user_home_t:s0
#默认安全上下文的设定完成
[root@VM-0-3-centos ~]# ll -Zd /www
drwxr-xr-x. 2 root root unconfined_u:object_r:user_home_t:s0 4096 Nov  9 17:52 /www

参考文献:
SELinux安全上下文查看方法(超详细)

下一篇:Linux学习-94-auditd日志系统使用

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

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

相关文章

Android设计模式详解之原型模式

前言 原型模式是一个创建型设计模式。 定义&#xff1a;用原型实例指定创建对象的种类&#xff0c;并通过复制这些原型创建新的对象。 使用场景&#xff1a; 类初始化需要消耗非常多的资源&#xff0c;这个资源包括数据、硬件资源&#xff0c;通过原型复制避免这些消耗&…

音质更出色的骨传导耳机,设计也很时尚,南卡Runner CC3上手

这两年我几乎每天都会用耳机&#xff0c;现在耳机的种类也不少&#xff0c;如果是户外健身的话&#xff0c;我觉得骨传导耳机比挂脖式的耳机更好用&#xff0c;这种耳机因为不入耳的使用方式&#xff0c;在我们听音乐的同时&#xff0c;还可以更清晰地感知周围的情况&#xff0…

【Django项目开发】自动生成接口文档(二)

文章目录一、安装第三方库drf-yasg2二、注册到子应用INSTALLED_APPS三、配置路由1、注意四、接口文档中展示详细的文档说明视图类中接口的标准注释五、视图类中自己定义的方法实现接口文档注释1、注意一、安装第三方库drf-yasg2 pip install drf-yasg2二、注册到子应用INSTALL…

新技术不断发展,一个全新的互联网行业的新风口已然来临

拥抱实体经济&#xff0c;绝对是当下互联网玩家们的首要选择。无论是头部的互联网企业来讲&#xff0c;还是新生的互联网玩家而言&#xff0c;它们都不约而同地将关注的焦点聚焦在了这样一个方向上。   透过这一点&#xff0c;我们可以非常明显地感受到&#xff0c;一个全新的…

网络技术展开型介绍(超详细)二

♥️作者&#xff1a;小刘在这里 ♥️每天分享云计算网络运维课堂笔记&#xff0c;疫情之下&#xff0c;你我素未谋面&#xff0c;但你一定要平平安安&#xff0c;一 起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的&#xff0c;绽放&#xff0c;…

MyBatis—MyBatis参数详解

文章目录MyBatis参数详解1、 parameterType2、resultType3、 resultMap结果类型MyBatis获取参数值的两种方式1.配置sql输出日志2.看#{}和${}的输出现象3.#{}的预编译4.sql注入5.什么时候使用${}6.如何选择使用 #{} 和 ${}7.为什么#{}可以预防sql注入—————————————…

Shuffle的作用以及MapReduce的Shuffle过程

Shuffle的设计 为什么需要Shuffle&#xff1f; Shuffle的本质是基于磁盘划分来解决分布式大数据量的全局分组、全局排序、重新分区【增大】 等问题 因为单台机器的资源处理不了分布式大数据量全局分区/排序/分组 所以需要通过Shuffle对每一台机器的数据构建一个Task来做分区的…

通关剑指 Offer——剑指 Offer II 055. 二叉搜索树迭代器

1.题目描述 剑指 Offer II 055. 二叉搜索树迭代器 实现一个二叉搜索树迭代器类BSTIterator &#xff0c;表示一个按中序遍历二叉搜索树&#xff08;BST&#xff09;的迭代器&#xff1a; BSTIterator(TreeNode root) 初始化 BSTIterator 类的一个对象。BST 的根节点 root 会…

20221221英语学习

今日新词 define v.下定义&#xff1b;确切说明&#xff08;或解释&#xff09;&#xff1b;树立&#xff0c;表明 chemistry n.化学, 物质的化学组成&#xff08;或性质&#xff09; fly v.飞, 飞翔, 航行, &#xff08;乘航空器或航天器&#xff09;航行 forfeit v.&…

港华燃气上线WeOps推动运维效能提升,托举业务智慧运行!

“嘉为蓝鲸WeOps一体化运维平台有效提升了运维工作效率&#xff0c;满足系统安全要求&#xff0c;尤其是补丁安装、巡检自动化、监控告警等功能&#xff0c;为我们节省了运维人力成本和时间成本。” ——来自港华燃气 港华集团介绍&#xff1a; 港华集团为香港中华煤气在内地…

m在LTE-A系统载波聚合下的资源分配算法的matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 载波聚合即CA&#xff0c;是LTE-A中的关键技术。是为满足用户峰值速率和系统容量提升的要求&#xff0c;增加系统传输带宽的技术&#xff0c;通过CA技术&#xff0c;用户最高上网速率可提升到300…

IPv4 和 IPv6 报文格式详解

文章目录1 概述2 报文格式2.1 IPv42.2 IPv62.3 两者区别3 网工软考真题1 概述 2 报文格式 2.1 IPv4 中文名英文名长度 bit&#xff08;位&#xff09;解释版本Version4IP协议版本号&#xff0c;固定为 4首部长度Header Length4数据报首部的总长度。 以 4 Byte&#xff08;字节…

【Java基础知识复盘】Java概述篇

本人知识复盘系列的博客并非全部原创&#xff0c;大部分摘自网络&#xff0c;只是为了记录在自己的博客方便查阅&#xff0c;往后也会陆续在本篇博客更新本人查阅到的新的知识点&#xff0c;望悉知&#xff01; Java概述 何为编程 编程就是让计算机为解决某个问题而使用某种程…

100多条2023年元宇宙统计数据!Hubbleverse替你整理好了!

欢迎来到Hubbleverse &#x1f30d; 关注我们 关注宇宙新鲜事 &#x1f4cc; 预计阅读时长&#xff1a;9分钟 本文仅代表作者个人观点&#xff0c;不代表平台意见&#xff0c;不构成投资建议。 元宇宙最近被评为最热门的新兴技术趋势之一。在过去的几年里&#xff0c;元宇宙…

SpringBoot整合Mybatis之Mapper接口和映射文件

一、什么是MyBatis MyBatis中文网https://mybatis.net.cn/ MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型…

消息中间件执行原理

1 关于消息中间件 1.1 什么是消息中间件&#xff1f; 消息中间件是指在分布式系统中完成消息的发送和接收的基础软件。 消息中间件也可以称消息队列&#xff08;Message Queue / MQ&#xff09;&#xff0c;用高效可靠的消息传递机制进行与平台无关的数据交流&#xff0c;并基…

区块链技术应用展望

区块链作为一个"去中心化"的分布式账本数据库&#xff0c;能够让数据的产生、运行和应用更加公开与透明。区块链被认为是互联网之后又一大创新之举&#xff0c;是第二个互联网时代——价值互联网时代的来临&#xff0c;区块链将从基础设施层面为各行各业带来巨大的变…

力扣(LeetCode)353. 贪吃蛇(2022.12.20)

请你设计一个 贪吃蛇游戏&#xff0c;该游戏将会在一个 屏幕尺寸 宽度 x 高度 的屏幕上运行。如果你不熟悉这个游戏&#xff0c;可以 点击这里 在线试玩。 起初时&#xff0c;蛇在左上角的 (0, 0) 位置&#xff0c;身体长度为 1 个单位。 你将会被给出一个数组形式的食物位置…

C++中二叉树的递归遍历方法

在《C中二叉树的非递归遍历方法2-1》中提到&#xff0c;二叉树的遍历分为前序遍历、中序遍历、后序遍历和层序遍历四种。要遍历的二叉树如图1所示。 图1 二叉树结构 创建该二叉树的代码请参见《C中二叉树的非递归遍历方法2-1》。 1 前序遍历的递归实现 前序遍历的输出顺序是…

VC2010 的控制台程序中使用 EasyX

以下是在 VC2010 的控制台应用程序中使用 EasyX 的具体步骤&#xff1a; 1. 启动 VC2010&#xff0c;点击菜单 File -> New -> Project...&#xff0c;打开 New Project 对话框&#xff1a; 2. 选择 “Win32 Console Application” 类型的项目&#xff0c;并选择项目所在…