vsFTPd服务部署和用户模式简介

vsFTPd(Very Secure File Transfer Protocol Daemon)是一款在类Unix系统(如Linux)中广泛使用的FTP服务器软件。

一、功能特点

  1. 安全性高

    • 它被设计为高度安全的FTP服务器。例如,它在默认配置下会以独立的低权限用户运行,这降低了系统被入侵后可能造成的危害。即使攻击者设法利用了vsFTPd的漏洞,由于其运行在低权限环境下,也很难对整个系统造成毁灭性的破坏。
    • 支持多种安全认证方式,包括PAM(Pluggable Authentication Modules)认证。PAM允许系统管理员灵活地配置用户认证方式,如可以通过系统用户数据库、LDAP(Lightweight Directory Access Protocol)等方式进行认证,从而增强了用户访问控制的安全性。
  2. 性能良好

    • vsFTPd在处理大量并发连接时表现出色。它采用了优化的网络I/O模型,能够高效地处理文件传输请求。例如,在一个企业内部网络中,当多个用户同时从服务器下载或上传文件时,vsFTPd可以有效地分配系统资源,保证文件传输的速度和稳定性。
    • 它对带宽的利用也比较合理,支持限速功能。系统管理员可以根据用户组或单个用户的需求,限制其最大上传和下载速度,避免个别用户过度占用带宽而影响其他用户的使用。
  3. 兼容性强

    • 能够很好地兼容各种FTP客户端软件。无论是命令行的FTP客户端(如Linux下的ftp命令),还是图形界面的客户端(如FileZilla等),都可以顺利地连接到vsFTPd服务器进行文件传输操作。
    • 支持多种文件系统,包括常见的ext4(Linux常用文件系统)、NTFS(Windows常用文件系统,通过一些兼容层)等。这意味着它可以方便地存储和传输存储在不同文件系统中的文件。

二、工作模式

  1. 主动模式(PORT模式)

    • 在主动模式下,客户端首先向服务器的FTP控制端口(默认是21)发送连接请求,建立控制连接。然后,当客户端需要进行数据传输时,它会在本地打开一个随机端口,并通过控制连接将这个端口号告诉服务器。服务器会主动发起一个从其数据端口(默认是20)到客户端指定端口的数据连接。不过,这种模式存在一个问题,就是如果客户端位于防火墙后面,防火墙可能会阻止服务器主动发起的数据连接,导致文件传输失败。
  2. 被动模式(PASV模式)

    • 被动模式解决了主动模式下防火墙可能带来的问题。在被动模式中,客户端同样先建立控制连接到服务器的21端口。当需要传输数据时,服务器会在本地打开一个随机的数据端口,并通过控制连接将这个端口号告知客户端。然后客户端主动发起一个从自己的数据端口到服务器指定数据端口的数据连接,这样就可以顺利地进行文件传输,即使客户端位于防火墙后面也能正常工作。

三、配置文件和基本配置选项

  1. 配置文件

    • vsFTPd的主要配置文件是/etc/vsftpd.conf(在Linux系统中)。这个文件包含了服务器的各种设置,如用户访问权限、目录设置、安全选项等。管理员可以通过编辑这个文件来定制服务器的行为。
  2. 基本配置选项

    • listen=YESlisten=NO:用于指定vsFTPd是独立运行(listen = YES)还是通过xinetd等服务来启动(listen = NO)。独立运行模式下,vsFTPd会直接监听指定的端口,通常用于需要高性能的场景;而通过xinetd启动则更加灵活,适用于对资源占用有严格控制的情况。
    • anonymous_enable=YESanonymous_enable=NO:用于控制是否允许匿名用户访问。如果设置为YES,匿名用户可以使用默认的用户名(如ftpanonymous)登录服务器,一般用于提供公共文件下载服务;设置为NO则禁止匿名用户访问,增强服务器的安全性。
    • local_enable=YESlocal_enable=NO:决定是否允许本地系统用户登录。如果设置为YES,系统中的用户可以使用自己的用户名和密码登录vsFTPd服务器进行文件操作。

三、部署和问题解决

1. 安装

操作系统: centos7.x

# 安装
yum install vsftpd

# 启动服务
systemctl start vsftpd
# 设置开机启动
systemctl enable vsftpd

配置文件样例:(/etc/vsftpd.conf)

# 允许匿名用户登录
anonymous_enable=YES
# 匿名用户的主目录
anon_root=/var/ftp
# 允许匿名用户上传文件
anon_upload_enable=NO
# 允许匿名用户创建目录
anon_mkdir_enable=NO
# 允许本地用户登录
local_enable=YES
# 本地用户的写入权限
write_enable=YES
# 本地用户的主目录,默认为用户的家目录
local_root=/home/ftpusers
# 开启被动模式
pasv_enable=YES
# 被动模式下服务器使用的端口范围,用于数据传输
pasv_min_port=40000
pasv_max_port=40100
# 设置以独立模式运行
listen=YES
# 设置最大客户端连接数
max_clients=100
# 设置每个IP的最大连接数
max_per_ip=5

2.用户设置:

vsftpd有三种用户访问模式:匿名;本地用户;虚拟用户。

  1. 匿名用户配置

    • 基本配置文件(/etc/vsftpd.conf)设置

      • 允许匿名用户访问:将anonymous_enable设置为YES。这是启用匿名用户访问的关键选项。例如:anonymous_enable = YES

      • 指定匿名用户主目录:通过anon_root选项设置匿名用户登录后的主目录。比如设置为/var/ftp,即anon_root = /var/ftp。这是匿名用户访问服务器时的初始目录。

      • 控制匿名用户上传权限

        • 如果希望禁止匿名用户上传文件,将anon_upload_enable设置为NO,如anon_upload_enable = NO
        • 若要允许匿名用户上传文件,在确保write_enable = YES(这个选项同时影响普通用户和匿名用户的写入权限)的基础上,将anon_upload_enable设置为YES,并且要注意设置anon_root目录的权限,使其可写。
      • 控制匿名用户创建目录权限

        • 要禁止匿名用户创建目录,将anon_mkdir_enable设置为NO,例如anon_mkdir_enable = NO
        • 若允许匿名用户创建目录,在满足写入权限的条件下,将anon_mkdir_enable设置为YES
    • 目录权限设置

      • 对于anon_root指定的匿名用户主目录(如/var/ftp),如果允许匿名用户上传或创建目录,需要设置合适的权限。例如,使用chmod命令设置权限,若要允许写入操作,可以将其权限设置为755rwxr - xr - x)或更宽松的权限(但要考虑安全性)。如chmod 755 /var/ftp
  2. 普通用户配置

    • 基本配置文件(/etc/vsftpd.conf)设置

      • 允许本地用户访问:将local_enable设置为YES,这是启用本地用户(普通用户)访问的关键选项。例如:local_enable = YES

      • 设置本地用户的写入权限:通过write_enable选项控制本地用户是否有写入权限。若希望本地用户能够上传、删除和修改文件等操作,将write_enable设置为YES,如write_enable = YES

      • 指定本地用户主目录:默认情况下,本地用户登录后的主目录是其在系统中的家目录。可以通过local_root选项修改这个默认设置。例如,设置为/home/ftpusers,即local_root = /home/ftpusers

      • 控制本地用户的访问权限

        • 可以使用chroot_local_user选项来限制本地用户只能访问其主目录及其子目录。如果设置chroot_local_user = YES,本地用户登录后将被“禁锢”在自己的主目录下。
        • 若要允许部分用户可以访问其他目录,可以结合chroot_list_enablechroot_list_file选项。例如,设置chroot_list_enable = YES,并指定一个文件(如/etc/vsftpd.chroot_list)来记录那些不被限制在主目录的用户名单,这些用户在名单中就可以访问其他目录。
    • 目录和用户权限设置

      • 对于local_root指定的本地用户主目录(如/home/ftpusers),如果允许用户写入,需要确保目录及其文件的权限设置合理。例如,用户的家目录权限一般为700rwx------),可以根据需要调整。同时,要注意文件系统的权限继承等特性,确保用户能够正常访问和操作文件。
  3. 虚拟用户配置

    • 创建虚拟用户数据库文件和PAM配置

      • 创建虚拟用户数据库文件:首先创建一个文本文件(如/etc/vsftpd/vsftpd - virtual - users.txt),格式为“用户名:密码”,每行一个用户记录。然后使用db_load命令将其转换为db数据库文件。例如:

        • 创建文本文件:

          user1:password1
          user2:password2
          
        • 转换为数据库文件(假设安装了db4 - utils包):

          • db_load -T -t hash -f /etc/vsftpd/vsftpd - virtual - users.txt /etc/vsftpd/vsftpd - virtual - users.db
      • 配置PAM(Pluggable Authentication Modules)认证:在/etc/pam.d/目录下创建一个名为vsftpd - virtual的文件,内容如下:

        auth required pam_userdb.so db=/etc/vsftpd/vsftpd - virtual - users
        account required pam_userdb.so db=/etc/vsftpd/vsftpd - virtual - users
        
    • 基本配置文件(/etc/vsftpd.conf)设置

      • 启用虚拟用户认证:添加guest_enable = YES,使vsftpd启用虚拟用户(以访客身份)登录。
      • 指定虚拟用户对应的系统用户:添加guest_username = ftpuser(假设使用ftpuser作为虚拟用户映射的系统用户,需要先创建这个系统用户)。这个系统用户的家目录将作为虚拟用户的根目录,除非另行指定。
      • 指向PAM配置文件:添加pam_service_name = vsftpd - virtual,告诉vsftpd使用前面创建的vsftpd - virtualPAM配置文件进行认证。
    • 设置虚拟用户的权限和目录

      • 为虚拟用户创建单独的目录:为每个虚拟用户创建单独的目录,例如为user1创建目录/var/ftp/virtual - users/user1,为user2创建目录/var/ftp/virtual - users/user2等。
      • 设置目录权限:使用chmod命令设置目录权限,一般可以设置为755,如chmod 755 /var/ftp/virtual - users/user1
      • 配置vsftpd的权限设置选项:在/etc/vsftpd.conf文件中,可以使用virtual_use_local_privs = YES(如果希望虚拟用户拥有与本地用户相同的权限)或virtual_use_local_privs = NO(如果希望虚拟用户权限受到更多限制)来控制虚拟用户的权限。还可以通过write_enable等选项来控制虚拟用户是否有写入权限。

对应的应用场景:

  1. 安全性优先场景推荐使用虚拟用户模式

    • 原因

      • 隔离系统账户安全风险:虚拟用户模式下,用户的账户信息存储在独立的数据库中,与系统用户账户(如/etc/passwd/etc/shadow中的账户)分离。即使虚拟用户的密码被泄露,攻击者也很难直接利用这些信息获取系统级别的访问权限,因为虚拟用户并不直接对应真实的系统账户。例如,在一个提供文件共享服务的服务器中,外部用户使用虚拟用户登录进行文件下载或上传,即使他们的虚拟用户密码被破解,也不会危及系统的其他服务(如SSH登录、系统管理员权限等)。
      • 灵活的权限管理:可以为每个虚拟用户或不同组的虚拟用户单独配置权限。比如,可以设置某些虚拟用户只能访问服务器上特定的目录用于文件下载,而另一些虚拟用户可以在多个目录中进行上传和下载操作。这种精细的权限控制有助于满足复杂的业务需求,同时将权限限制在必要的范围内,减少潜在的安全漏洞。例如,在企业内部的文件服务器中,对于不同部门的员工可以创建不同的虚拟用户组,分别赋予不同的文件访问和操作权限。
  2. 内部网络环境且对权限管理要求不高场景可使用普通用户模式

    • 原因

      • 方便利用现有系统用户体系:在内部网络环境中,如果服务器主要用于企业内部员工之间的文件传输,并且已经有完善的系统用户管理机制,使用普通用户模式可以方便地利用现有的系统用户账户。员工可以使用他们在系统中的账户登录vsftpd服务器,减少额外的配置工作。例如,在一个小型办公室网络中,员工使用自己的系统账户登录FTP服务器来共享和交换工作文件。
      • 相对熟悉的权限管理方式:普通用户的权限管理在一定程度上依赖于系统用户本身的权限设置。对于熟悉系统用户管理(如Linux系统中的用户组、文件权限等概念)的管理员来说,通过配置/etc/vsftpd.conf文件中的相关选项(如write_enablechroot_local_user等)来控制普通用户在FTP服务中的权限相对比较直观。例如,通过设置chroot_local_user选项可以限制本地用户只能访问其主目录及其子目录,这与系统中对用户文件访问范围的控制有一定的相似性。
  3. 提供公共文件下载服务场景可以考虑匿名用户模式

    • 原因

      • 简单方便:匿名用户模式的配置相对简单,主要用于提供公共文件下载服务。当服务器上有一些公开的、不需要用户认证即可访问的文件(如软件更新包、公开文档等)时,启用匿名用户模式并设置好相应的文件目录(如anon_root目录),就可以让用户方便地下载文件。例如,一个开源软件项目的服务器可以通过匿名FTP服务提供软件的安装包供用户下载。
      • 安全风险可控(对于纯下载场景) :在只提供文件下载的情况下,即使允许匿名用户访问,安全风险相对较低。因为匿名用户没有写入权限,无法修改服务器上的文件,也就不容易对服务器造成破坏。不过,如果需要提供文件上传功能,匿名用户模式的安全风险会显著增加,需要谨慎配置(如严格控制上传目录和权限)。

3. PAM认证

  1. PAM(Pluggable Authentication Modules)认证简介

    • 定义和作用

      • PAM是一种用于Linux及其他类Unix系统中的认证机制,它提供了一种灵活的方式来进行用户认证、账户管理、会话管理等操作。通过PAM,系统服务(如vsftpd)可以使用不同的认证方式,而无需将这些认证逻辑硬编码到服务本身。例如,它可以让vsftpd根据配置选择使用系统用户数据库认证、LDAP认证或者其他自定义的认证方式。
      • PAM的核心是一系列的模块,这些模块可以在不同的阶段(如认证阶段、账户检查阶段等)对用户请求进行处理。每个模块可以执行特定的功能,比如验证用户密码、检查账户是否过期等,并且可以根据模块的返回结果来决定是否允许用户访问服务。
    • 工作流程

      • 当用户尝试访问一个使用PAM认证的服务(如vsftpd)时,PAM会按照配置文件中指定的顺序加载相关的模块。首先是认证(auth)阶段,模块会验证用户提供的身份信息(如用户名和密码)是否正确。然后是账户(account)阶段,会检查用户账户的状态,例如账户是否被锁定、是否过期等。如果用户通过了这些阶段,就可以成功访问服务。
  2. 普通用户模式下vsftpd中PAM认证的设置

    • 默认设置说明

      • 在普通用户模式下,vsftpd默认使用系统的PAM配置进行认证。在CentOS等Linux系统中,其对应的PAM配置文件通常是/etc/pam.d/vsftpd。这个文件中的配置会引导vsftpd使用系统的用户数据库(如/etc/passwd/etc/shadow)来验证用户身份。
    • 关键配置选项解释(在默认配置文件中)

      • auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed

        • 这一行用于检查用户是否在/etc/vsftpd/ftpusers文件中。如果用户在这个文件中,认证将被拒绝。pam_listfile.so是PAM的一个模块,用于检查用户是否在指定的文件列表中。item = user表示按用户名进行检查,sense = deny表示如果用户在文件中则拒绝,file = /etc/vsftpd/ftpusers指定了检查的文件,onerr = succeed表示如果文件读取错误(例如文件不存在),则认证继续进行(视为成功)。
      • auth required pam_shells.so

        • 这一行用于检查用户的登录shell是否在/etc/shells文件中。如果用户的登录shell不在这个文件中,认证将被拒绝。这是为了确保只有拥有合法登录shell的用户才能访问vsftpd服务,从而增加安全性。
      • auth required pam_unix.so

        • 这是使用系统的pam_unix.so模块进行用户身份验证。它会根据系统用户数据库(/etc/passwd/etc/shadow)中的信息来验证用户提供的用户名和密码是否正确。
      • account required pam_unix.so

        • 在账户检查阶段,使用pam_unix.so模块检查用户账户的状态。例如,它会检查账户是否被锁定、是否过期等情况,以确保只有合法状态的账户才能访问服务。

一般情况下,如果只是使用普通用户模式,并且系统的PAM配置没有被修改过,vsftpd可以正常使用系统用户进行认证。如果需要特殊的认证要求(如添加额外的认证方式或者修改现有认证规则),则可以修改/etc/pam.d/vsftpd文件中的配置。不过,修改PAM配置需要谨慎,因为错误的配置可能会导致用户无法正常访问服务。

但是呢,在搜索到的安装说明的博文中,很多都会要求创建ftp的本地用户后,设置禁止该用户登录访问操作系统,比如下面:

useradd ftpuser
useradd -d /home/ftpuser -m ftpuser
usermod -s /sbin/nologin ftpuser

# password ftpuser

但是这里PAM认证会有问题,当输入了用户密码后,还是无法登录创建好的ftp,哪怕用户密码是正确的。在默认的 PAM 配置中,对于 FTP 服务的认证,可能会包含对用户登录 shell 的检查,如auth required pam_shells.so这一配置项会检查用户的 shell 是否在/etc/shells文件内。如果将 FTP 用户的登录 shell 设置为不可登录的类型,那么在进行 PAM 认证时,这一检查可能会导致认证失败

解决办法:

  • 注释或修复特定行:在/etc/pam.d/vsftpd文件中,找到auth required pam_shells.so这一行,将其注释掉或修改为auth required pam_nologin.so
  • 确认其他关键配置项:检查文件中的其他配置项是否满足需求,如auth required pam_listfile.so item=user sense=deny file=/etc/ftpusers onerr=succeed用于检查用户是否在/etc/ftpusers文件中被禁止登录,可根据实际情况调整该文件中的用户列表;auth required pam_unix.so shadow nullok用于进行标准的 Unix 认证,通常不需要修改,但如有特殊认证需求可进一步调整

在普通用户模式下禁止用户登录操作系统后,可通过以下方法确保PAM认证能正常工作:
修改PAM配置文件

  • 注释或修改特定行:在/etc/pam.d/vsftpd文件中,找到auth required pam_shells.so这一行,将其注释掉或修改为auth required pam_nologin.so
  • 确认其他关键配置项:检查文件中的其他配置项是否满足需求,如auth required pam_listfile.so item=user sense=deny file=/etc/ftpusers onerr=succeed用于检查用户是否在/etc/ftpusers文件中被禁止登录,可根据实际情况调整该文件中的用户列表;auth required pam_unix.so shadow nullok用于进行标准的Unix认证,通常不需要修改,但如有特殊认证需求可进一步调整。

其他需要排查的问题:

检查用户及权限设置

  • 确保用户存在且属性正确:确认禁止登录操作系统的普通用户在系统中存在,且其主目录和相关权限设置正确。例如,用户的主目录应具有适当的读写权限,以便用户在登录FTP时能够正常访问和操作文件。可使用命令ls -ld /home/用户名查看用户主目录的权限。
  • 检查用户组及组成员关系:确保用户所属的用户组以及组权限设置不会影响PAM认证和FTP登录。有时候,特定的用户组可能具有特殊的权限或限制,需要根据实际情况进行调整。

检查vsftpd服务配置

  • 确认相关选项启用:在/etc/vsftpd/vsftpd.conf文件中,确保local_enable=YES已设置,以启用本地用户登录。
  • 设置用户限制选项:根据需要设置chroot_local_user=YES等选项,将用户限制在其主目录内,以增强安全性。

测试与调试

  • 进行登录测试:在完成上述设置后,尝试使用普通用户登录FTP服务器,观察是否能够正常认证和登录,以及是否能够进行预期的文件操作。
  • 查看日志文件:如果登录出现问题,可以查看/var/log/vsftpd.log等相关日志文件,以获取更详细的错误信息,帮助定位和解决问题。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

排序算法——堆排序

什么是堆 堆就是一种特殊的二叉树,他有以下特点: 堆中某个节点的值总是不大于或不小于其父节点的值; 堆总是一棵完全二叉树。 堆又可以分为大根堆和小根堆 大根堆:根节点最大,每个节点都小于或等于父节点 小跟堆&am…

数据挖掘——聚类

数据挖掘——聚类 聚类K-meansKNN VS K-meansK-Nearest Neighbors (KNN)K-means K中心算法PAM算法 K-modes算法——解决数据敏感的问题KMeans算法 ——解决初始点选择问题K-中心点层次方法AGNES算法——最小距离单链接全链接平均链接 聚类评估K均值和K中心点的优缺点层次化聚类…

在线机考|2024华为实习秋招春招编程题(最新)——第3题_个性化歌单推荐系统_300分(十一)

题目内容 假设你是音乐服务的开发者,为了提高用户体验需要解决推荐歌单的同质化问题,保证推荐给用户的所有歌单不包含相同歌曲的。给定一个包含N个歌单和M条歌单重复记录,每个歌单用一个从1到N的整数编号,歌单重复记录包含两个歌单的ID,表示两个歌单有相同的歌曲。 你的任…

每日OJ_牛客_宵暗的妖怪_DP_C++_Java

目录 牛客_宵暗的妖怪_DP 题目解析 C代码 Java代码 牛客_宵暗的妖怪_DP 宵暗的妖怪 描述: 露米娅作为宵暗的妖怪,非常喜欢吞噬黑暗。这天,她来到了一条路上,准备吞噬这条路上的黑暗。这条道路一共被分为n 部分&…

开源架构的自动化测试策略优化版

最近四篇文章推荐: 开源架构的容器化部署优化版(New) 开源架构的微服务架构实践优化版(New) 开源架构中的数据库选择优化版(New) 开源架构学习指南:文档与资源的智慧锦囊&#xff08…

2. 进程和线程

文章目录 前言1. 进程是什么2. 进程的相关属性3. 线程是什么4. 为什么引入线程5. 进程和线程的区别 前言 上一篇博客,我们讲到了CPU和操作系统,今天我们讲一个操作系统中一个非常重要的概念—线程和进程 1. 进程是什么 每个应用程序运行于现代操作系统…

三甲医院等级评审八维数据分析应用(八)--数据治理的持续改进与反馈机制篇

一、引言 1.1 研究背景与意义 当前三甲医院在数据管理方面暴露出诸多棘手问题。一方面,数据治理缺乏系统性与规范性,数据标准不统一,不同科室、信息系统之间的数据格式各异、编码混乱,导致数据整合与共享困难重重,严重制约了数据分析的准确性与深度。以某三甲医院为例,…

HTML——66.单选框

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>单选框</title></head><body><!--input元素的type属性&#xff1a;(必须要有)--> <!--单选框:&#xff08;如所住省会&#xff0c;性别选择&…

数据结构与算法之排序

9.1 排序的概念 1. 排序的定义 定义&#xff1a;排序是将表中的记录按关键字递增&#xff08;或递减&#xff09;有序排列的过程。说明&#xff1a;数据中可以存在相同关键字的记录。本章主要考虑递增排序。扩展&#xff1a;排序是数据处理中的基本操作之一&#xff0c;广泛应用…

Swagger学习⑩——@Server注解

介绍 Server 是 Swagger/OpenAPI 3.0 注解中的一个注解&#xff0c;用于定义 API 文档中的服务器信息。通过 Server 注解&#xff0c;你可以指定 API 服务的基础 URL 或其他相关信息。 源代码 package io.swagger.v3.oas.annotations.servers;import io.swagger.v3.oas.anno…

MATLAB仿真:基于GS算法的经大气湍流畸变涡旋光束波前校正仿真

GS算法流程 GS&#xff08;Gerchberg-Saxton&#xff09;相位恢复算法是一种基于傅里叶变换的最速下降算法&#xff0c;可以通过输出平面和输入平面上光束的光强分布计算出光束的相位分布。图1是基于GS算法的涡旋光束畸变波前校正系统框图&#xff0c;在该框图中&#xff0c;已…

C语言笔记之`char*`、`const char*` 和 `char[]`辨析

C语言笔记之char*、const char* 和 char[]辨析 code review! 参考笔记 1.C语言笔记之char*、const char* 和 char[]辨析 2.C++笔记之int、size_t、uint8_t、unsigned char*区别 3.C++之char和string字符串类探究 4.C++笔记之字节数组的处理 5.C++笔记之如何给 const char* 类型…

十种基础排序算法(C语言实现,带源码)(有具体排序例子,适合学习理解)

学习了十种常见的排序方法&#xff0c;此文章针对所学的排序方法进行整理&#xff08;通过C语言完成排序&#xff09;。 参考内容&#xff1a; https://blog.csdn.net/mwj327720862/article/details/80498455 https://www.runoob.com/w3cnote/ten-sorting-algorithm.html 1. 冒…

Timer、Ticker使用及其注意事项

Timer、Ticker使用及其注意事项 在刚开始学习golang语言的时候就听说Timer、Ticker的使用要尤其注意&#xff0c;很容易出现问题&#xff0c;这次就来一探究竟。 本文主要脉络&#xff1a; 介绍定时器体系&#xff0c;并介绍常用使用方式和错误使用方式源码解读 timer、tic…

密码学科普

1 信息传输中的安全隐患 1. 窃听 解决方案&#xff1a;明文加密&#xff0c;X只能窃听到密文 2. 假冒 解决方案&#xff1a;消息认证码或者数字签名 3. 篡改 解决方案&#xff1a;消息认证码或者数字签名 4. 事后否认 解决方案&#xff1a;数字签名 2 对称加密/非对称加密 1…

MMPose关键点检测实践(一)

一&#xff0c;安装环境 这一步&#xff0c;需根据自己的硬件环境&#xff0c;按照以下文档安装即可&#xff0c;最大的变数就是不同的硬件&#xff0c;对应的软件版本不一样&#xff0c;这个因人而异&#xff0c;没有统一版本。mmpose安装说明&#xff1a; https://mmpose.r…

指针 const 的组合

1、首先来了解一下常量 const int num 5&#xff1b; 那么num的值是5&#xff0c; num的值不可修改 2、来了解一下指针 int value 5; int* p &value; 我喜欢吧指针和类型放一起&#xff0c;来强调p是一个指针类型&#xff0c; 而赋值的时候就得赋值一个int类型的地址…

Unity-Mirror网络框架从入门到精通之Attributes属性介绍

前言 在现代游戏开发中&#xff0c;网络功能日益成为提升游戏体验的关键组成部分。Mirror是一个用于Unity的开源网络框架&#xff0c;专为多人游戏开发设计。它使得开发者能够轻松实现网络连接、数据同步和游戏状态管理。本文将深入介绍Mirror的基本概念、如何与其他网络框架进…

【大数据】(选修)实验4 安装熟悉HBase数据库并实践

实验4 安装熟悉HBase数据库并实践 1、实验目的 (1)理解HBase在Hadoop体系结构中的角色; (2)熟练使用HBase操作常用的Shell命令; (3)熟悉HBase操作常用的Java API。 2、实验平台 操作系统:Linux Hadoop版本:2.6.0或以上版本 HBase版本:1.1.2或以上版本 JDK版…

VVenC 编码器源码结构与接口函数介绍

VVenC VVenC&#xff08;Fraunhofer Versatile Video Encoder&#xff09;是由德国弗劳恩霍夫海因里希研究所&#xff08;Fraunhofer Heinrich Hertz Institute, HHI&#xff09;开发的一个开源的高效视频编码器。它实现了最新的视频编码标准——Versatile Video Coding (VVC)…