Linux 基础学习训练教材 - CentOS 8.x

课程问题参考解答

单纯提供一个相对的解答,并不是标准答案!

最近更新时间: 2020/06/11

单纯就是个解答的参考,写完之后再来这边查查看答案跟你想的一样不一样!?

第 10 堂课

  • 例题 10.1.1-1:
    # A. 创建教材说到的,最大的 UID 号码的帐号
    [root@station5-237 ~]# useradd -u 4294967294  maxuser1
    [root@station5-237 ~]# id maxuser1
    uid=4294967294(maxuser1) gid=1010(maxuser1) groups=1010(maxuser1)
    
    # B. 测试更大的 ID 号码
    [root@station5-237 ~]# useradd -u 4294967295  maxuser2
    useradd: invalid user ID '4294967295'
    
    # C. 赶紧删除这个帐号
    [root@station5-237 ~]# userdel -r maxuser1
    
    所以,最大的帐号其实是 4294967294 才对!教材写的可能是指引~
  • 例题 10.1.1-2:
    1. 先处理强迫用户修改密码的手段,其实就是:『让用户变更密码的时间成为史前时代 (1970-01-01之前)』即可!
      # a. 创建一个新的帐号
      [root@station5-237 ~]# useradd check
      [root@station5-237 ~]# echo check123 | passwd --stdin check
      更改用户 check 的密码。
      passwd:所有核对代符都已成功更新。
      
      [root@station5-237 ~]# grep check /etc/shadow
      check:$6$PgqI4tYyBNaoTt......k5s6OVYQ1rWj2rfYNrsM1zp.:18393:0:99999:7:::
      
      [root@station5-237 ~]# date +%s
      1589176493
      [root@station5-237 ~]# echo $(( $(date +%s) /(60*60*24) ))
      18393  <==果然就是今天的日期啊!
      
      # b. 修改一下目前 check 这个帐号的密码修订时间,变成 1970-01-01 之前的日子!
      
      [root@station5-237 ~]# chage -d 0 check
      [root@station5-237 ~]# grep check /etc/shadow
      check:$6$PgqI4tYyBNaoTt......k5s6OVYQ1rWj2rfYNrsM1zp.:0:0:99999:7:::
      
      # c. 尝试从 student 变成 check,看看需要输入密码的情况变怎样?
      [student@station5-237 13:59 1 ~]$ su - check
      密码:  <==这里输入 check123 喔!
      You are required to change your password immediately (administrator enforced)  <==提示 root 要求的!
      Current password:  <==旧的密码
      新 密码:          <==新的密码
      再次输入新的 密码:<==新的密码
      
      [check@station5-237 ~]$ exit
      
      通过这个练习,你就知道怎么强迫用户变更他自己的密码的方式了!
    2. 处理无归属文件的方式:
      # a. 用比较『保守』,不会删除用户家目录的方法删除 check 这个用户:
      [root@station5-237 ~]# userdel check
      
      [root@station5-237 ~]# ll -d /home/check /var/spool/mail/check
      drwx------. 3 1008 1010 99  5月 11 14:03 /home/check
      -rw-rw----. 1 1008 mail  0  5月 11 13:53 /var/spool/mail/check
      # 果然有无归属的文件文件名存在!
      
      # b. 用 find 找出来无归属的文件名与属性
      [root@station5-237 ~]# man find
      ......
             -nouser
                    No user corresponds to file's numeric user ID.
      
      [root@station5-237 ~]# find /var /home -nouser
      [root@station5-237 ~]# ll -d $(find /var /home -nouser)
      drwx------. 3 1008 1010  99  5月 11 14:03 /home/check
      -rw-------. 1 1008 1010   5  5月 11 14:03 /home/check/.bash_history
      -rw-r--r--. 1 1008 1010  18 11月  9  2019 /home/check/.bash_logout
      -rw-r--r--. 1 1008 1010 141 11月  9  2019 /home/check/.bash_profile
      -rw-r--r--. 1 1008 1010 312 11月  9  2019 /home/check/.bashrc
      drwxr-xr-x. 4 1008 1010  39  2月 26 09:02 /home/check/.mozilla
      drwxr-xr-x. 2 1008 1010   6  5月 14  2019 /home/check/.mozilla/extensions
      drwxr-xr-x. 2 1008 1010   6  5月 14  2019 /home/check/.mozilla/plugins
      -rw-rw----. 1 1008 mail   0  5月 11 13:53 /var/spool/mail/check
      
      # c. 请删除这几个无归属文件:
      [root@station5-237 ~]# rm -r $(find /var /home -nouser)
      
    3. 尝试回答许多问题:
      student:$6$3iq4VYrt$Hg62ID...RVbE/:16849:5:180:7:::
      
      1. 最近修改时间为 16849 这个日期,由日期可以计算出总秒数,再从总秒数去推出日期喔!
        # student:$6$3iq4VYrt$Hg62ID...RVbE/:16849:5:180:7:::
        
        [root@station5-237 ~]# echo $((16849*60*60*24))
        1455753600
        [root@station5-237 ~]# date --date="@$(echo $((16849*60*60*24)))"
        四  2月 18 08:00:00 CST 2016
        
        所以,差不多是 2016 年 2 月 18 日前后!
      2. 那一个日期之前不能修改?这个与后续字段有关!
        # student:$6$3iq4VYrt$Hg62ID...RVbE/:16849:5:180:7:::
        
        所以是 2/18 之后的 5 日内不能修改,应该是 2016/02/22 (含)之前无法修改喔!
      3. 哪个日期之前最好修改?
        # student:$6$3iq4VYrt$Hg62ID...RVbE/:16849:5:180:7:::
        
        [root@station5-237 ~]# date --date="2016/02/18 + 180days"
        二  8月 16 00:00:00 CST 2016
        
        所以,『大概』是在 2016/08/16 前后需要修改比较好!不要等到最后一天啊!
      4. 因为倒数第二个字段并没有日期,因此这个帐号不会失效!倒是密码会过期!记得要更新!否则系统会强迫你更新!
  • 例题 10.1.2-1:
    # A. 使用 passwd 检查 testuser1 的密码状态
    [root@station5-237 ~]# passwd --help
    用法: passwd [OPTION...] 
      -k, --keep-tokens       保留未过期的验证代符
      -d, --delete            删除已有命名帐号的密码(仅限 root 运行);若有的话也移除密码锁定
      -l, --lock              锁住已命名帐号的密码 (仅限 root 运行)
      -u, --unlock            解开已命名帐号的密码锁定 (仅限 root 运行)
      -e, --expire            让已命名帐号的密码过期 (仅限 root 运行)
      -f, --force             强制作业
      -x, --maximum=DAYS      最大密码有效期限 (仅限 root 运行)
      -n, --minimum=DAYS      最小密码有效期限 (仅限 root 运行)
      -w, --warning=DAYS      用户在密码过期前收到警告的天数 (仅限 root 运行)
      -i, --inactive=DAYS     帐号在密码过期后即将被禁用前的天数 (仅限 root 运行)
      -S, --status            回报已命名帐号上的密码状态 (仅限 root 运行)
          --stdin             由 stdin 读取新的代符(仅限 root 运行)
    
    Help options:
      -?, --help              显示本说明消息
          --usage             显示简短的使用说明
    
    [root@station5-237 ~]# passwd -S testuser1
    testuser1 PS 2020-05-11 0 99999 7 -1 (密码已设置,SHA512 加密法。)
    
    # B. 调整最大密码存活时间从 99999 变成 180 天
    [root@station5-237 ~]# passwd -x 180 testuser1
    调整用户 testuser1 的期限数据。
    passwd: 成功
    [root@station5-237 ~]# passwd -S testuser1
    testuser1 PS 2020-05-11 0 180 7 -1 (密码已设置,SHA512 加密法。)
    
    # C. 警告期限从 7 天变成 14 天
    [root@station5-237 ~]# passwd -w 14 testuser1
    调整用户 testuser1 的期限数据。
    passwd: 成功
    [root@station5-237 ~]# passwd -S testuser1
    testuser1 PS 2020-05-11 0 180 14 -1 (密码已设置,SHA512 加密法。)
    
    # D. 锁定这个帐号的密码使用权限
    [root@station5-237 ~]# passwd -l testuser1
    锁定用户 testuser1 的密码。
    passwd: 成功
    [root@station5-237 ~]# passwd -S testuser1
    testuser1 LK 2020-05-11 0 180 14 -1 (密码已锁定。)
    [root@station5-237 ~]# grep testuser1 /etc/shadow
    testuser1:!!$6$80dXJbaTImyTNKKd$pSELDyrLl......f8dYmw3oknrTlIZOQSStgJsFdU1:18393:0:180:14:::
    
    锁定密码还挺有趣的!因为密码字段的『长度』是固定的,所以,只要密码字段长度改变,该密码就完全无用!因此, 暂时在密码前面加上两个 !! 就可以让该帐号失效了!
  • 例题 10.1.2-2:
    # A. 使用 chage 观察用户密码
    [root@station5-237 ~]# chage --help
    Usage: chage [options] LOGIN
    
    Options:
      -d, --lastday LAST_DAY        set date of last password change to LAST_DAY
      -E, --expiredate EXPIRE_DATE  set account expiration date to EXPIRE_DATE
      -h, --help                    display this help message and exit
      -I, --inactive INACTIVE       set password inactive after expiration
                                    to INACTIVE
      -l, --list                    show account aging information
      -m, --mindays MIN_DAYS        set minimum number of days before password
                                    change to MIN_DAYS
      -M, --maxdays MAX_DAYS        set maximum number of days before password
                                    change to MAX_DAYS
      -R, --root CHROOT_DIR         directory to chroot into
      -W, --warndays WARN_DAYS      set expiration warning days to WARN_DAYS
    
    [root@station5-237 ~]# LANG=C chage -l testuser1
    Last password change                                    : May 11, 2020
    Password expires                                        : Nov 07, 2020
    Password inactive                                       : never
    Account expires                                         : never
    Minimum number of days between password change          : 0
    Maximum number of days between password change          : 180
    Number of days of warning before password expires       : 14
    
    # B. 尝试修改密码最大存活时间
    [root@station5-237 ~]# chage -M 365 testuser1
    [root@station5-237 ~]# LANG=C chage -l testuser1
    Last password change                                    : May 11, 2020
    Password expires                                        : May 11, 2021
    Password inactive                                       : never
    Account expires                                         : never
    Minimum number of days between password change          : 0
    Maximum number of days between password change          : 365
    Number of days of warning before password expires       : 14
    
    # C. 警告时限则改为 30 天
    [root@station5-237 ~]# chage -W 30 testuser1
    [root@station5-237 ~]# LANG=C chage -l testuser1
    Last password change                                    : May 11, 2020
    Password expires                                        : May 11, 2021
    Password inactive                                       : never
    Account expires                                         : never
    Minimum number of days between password change          : 0
    Maximum number of days between password change          : 365
    Number of days of warning before password expires       : 30
    
    # D. 使用 usermod 解开密码锁定的问题
    [root@station5-237 ~]# usermod --help
    Usage: usermod [options] LOGIN
    
    Options:
      -L, --lock                    lock the user account
      -U, --unlock                  unlock the user account
    ......
    
    [root@station5-237 ~]# usermod -U testuser1
    [root@station5-237 ~]# grep testuser1 /etc/shadow
    testuser1:$6$80dXJbaTImyTNKKd$pSELDyrLl.......f8dYmw3oknrTlIZOQSStgJsFdU1:18393:0:365:30:::
    
    [root@station5-237 ~]# passwd -S testuser1
    testuser1 PS 2020-05-11 0 365 30 -1 (密码已设置,SHA512 加密法。)
    
  • 例题 10.1.3-1:
    [root@station5-237 ~]# cd ~/bin
    [root@station5-237 bin]# cat > users.txt << eof
    > linuxuser1
    > linuxuser2
    > linuxuser3
    > eof
    [root@station5-237 bin]# cat users.txt
    linuxuser1
    linuxuser2
    linuxuser3
    
    [root@station5-237 bin]# vim account.sh
    #!/bin/bash
    
    users=$( cat users.txt )
    for username in ${users}
    do
            useradd ${username}
            echo ${username} | passwd --stdin ${username}
            chage -d 0 ${username}
    done
    
    [root@station5-237 bin]# chmod a+x account.sh
    [root@station5-237 bin]# account.sh
    更改用户 linuxuser1 的密码。
    passwd:所有核对代符都已成功更新。
    更改用户 linuxuser2 的密码。
    passwd:所有核对代符都已成功更新。
    更改用户 linuxuser3 的密码。
    passwd:所有核对代符都已成功更新。
    
  • 例题 10.1.4-1:
    [root@station5-237 ~]# mkdir /dev/shm/mydir
    [root@station5-237 ~]# touch /dev/shm/myfile
    [root@station5-237 ~]# ll -d /dev/shm/my*
    drwxr-xr-x. 2 root root 40  5月 11 15:54 /dev/shm/mydir
    -rw-r--r--. 1 root root  0  5月 11 15:54 /dev/shm/myfile
    
    # 原因是这样的! umask 代表移除的权限,所以 022 代表减去 ----w--w-
    由于目录的 x 很重要,因此目录的缺省权限应该是 rwxrwxrwx ,文件则应该是 rw-rw-rw-,因此:
    目录: (rwxrwxrwx) - (----w--w-) ==> rwxr-xr-x
    文件: (rw-rw-rw-) - (----w--w-) ==> rw-r--r--
    
  • 例题 10.2-1:
    1. 使用 root 管理可以使用 sudo 的用户:
      [root@station5-237 bin]# visudo
      ## Allow root to run any commands anywhere
      root    ALL=(ALL)       ALL
      student ALL=(ALL)       ALL
      # 增加上面这行就可以了!
      
    2. 使用一般帐号,就是 student 来处理一下 sudo 这个指令的用法:
      # a. 初次使用 sudo 时,才会有提示功能。
      #    而且在第一次输入密码后的 5 分钟内,都可以不用再次输入密码
      [student@station5-237 16:55 2 ~]$ sudo grep student /etc/shadow
      
      We trust you have received the usual lecture from the local System
      Administrator. It usually boils down to these three things:
      
          #1) Respect the privacy of others.
          #2) Think before you type.
          #3) With great power comes great responsibility.
      
      [sudo] password for student:  <==这里输入 student 自己的密码!不是 root 的!
      student:$6$unA/8Xw1.tQQaGh6$QfDjurdasF.......bVynh5IOEzVSeo/hEqs/:18343:0:99999:7:::
      [student@station5-237 16:55 3 ~]$
      
      # b. 输入自己的密码,而且一直用 root 身份操作系统喔!
      [student@station5-237 16:55 3 ~]$ sudo su -
      [root@station5-237 ~]#
      
      只要在最近运行 sudo 的 5 分钟内再次使用 sudo 时,就无须重新输入密码!系统会假设你还是你!如果超过 5 分钟以上才又操作 sudo, 那就得要重新输入一次『用户自己的密码』了!
  • 例题 10.2-2:
    1. 先测试一下,没有权限使用 sudo 的伙伴是怎么回事?
      [linuxuser1@station5-237 ~]$ id linuxuser1
      uid=1008(linuxuser1) gid=1010(linuxuser1) groups=1010(linuxuser1)
      # 确定没有加入 wheel 群组喔!
      
      [linuxuser1@station5-237 ~]$ sudo tail /etc/shadow
      [sudo] password for linuxuser1:  <==输入 linuxuser1 自己的密码
      linuxuser1 is not in the sudoers file.  This incident will be reported.
      # 肯定的说, linuxuser1 并不在 sudoers 的支持文件内!
      
    2. 开始以系统管理员的身份处理,让 linuxuser1 支持 wheel 群组来测试看看:
      [root@station5-237 ~]# usermod -a -G wheel linuxuser1
      [root@station5-237 ~]# id linuxuser1
      uid=1008(linuxuser1) gid=1010(linuxuser1) groups=1010(linuxuser1),10(wheel)
      # 有喔!是有支持的喔!
      
    3. 最终再以 linuxuser1 来测试一下!
      [linuxuser1@station5-237 ~]$ id
      uid=1008(linuxuser1) gid=1010(linuxuser1) groups=1010(linuxuser1),10(wheel) 
      # 务必确定自己能看到!否则请注销后再次登录才会生效!
      
      [linuxuser1@station5-237 ~]$ sudo tail /etc/shadow
      [sudo] password for linuxuser1:
      linuxuser3:$6$3pTauo0YPDkSKXl6$o79.xaYl......gQBdQRkAxFzAgxhgsYrODwtgV31:0:0:99999:7:::
      mailuser1:$6$AwPP4xUtWrY/ADC3$Fes4vW/SV......Isp6m/W3Hyz70QqoEu5OjIBaJ1:18393:0:99999:7:::
      # 是的!确定有支持了!
      
  • 例题 10.3.1-1:
    # A. 找出系统支持 EXT4 文件系统的磁盘
    [root@station5-237 ~]# df -T | grep -v tmpfs
    Filesystem              Type     1K-blocks    Used Available Use% Mounted on
    /dev/mapper/centos-root xfs       10475520 4730196   5745324  46% /
    /dev/vda2               ext4       1998672  149448   1727984   8% /boot
    /dev/mapper/centos-home xfs        3135488   71160   3064328   3% /home
    
    [root@station5-237 ~]# mount | grep /boot
    /dev/vda2 on /boot type ext4 (rw,relatime,seclabel)
    
    # B. 查找一下挂载参数为何
    [root@station5-237 ~]# dumpe2fs /dev/vda2 | less
    Filesystem volume name:   
    Last mounted on:          /boot
    Filesystem UUID:          73f13e7b-43c4-43c5-93b4-9e65b962752d
    Filesystem magic number:  0xEF53
    Filesystem revision #:    1 (dynamic)
    Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery 
        extent 64bit flex_bg sparse_super large_file huge_file dir_nlink extra_isize metadata_csum
    Filesystem flags:         signed_directory_hash
    Default mount options:    user_xattr acl
    .....
    # 果然挂载缺省就支持 ACL 了!基本上,无须观察 mount 的结果!
    
  • 例题 10.3.2-1:
    1. 先来创建好群组与帐号
      # a. 设计群组,题目要求要使用系统群组而非一般群组
      [root@station5-237 ~]# groupadd -r myteacher
      [root@station5-237 ~]# groupadd -r mystudent
      [root@station5-237 ~]# egrep 'myteacher|mystudent' /etc/group
      myteacher:x:976:
      mystudent:x:975:  <==会发现, GID 都小于 1000 以下!
      
      # b. 开始创建帐号与密码
      [root@station5-237 ~]# useradd -G myteacher myteacher1
      [root@station5-237 ~]# useradd -G myteacher myteacher2
      [root@station5-237 ~]# useradd -G myteacher myteacher3
      [root@station5-237 ~]# useradd -G mystudent mystudent1
      [root@station5-237 ~]# useradd -G mystudent mystudent2
      [root@station5-237 ~]# useradd -G mystudent mystudent3
      
      # c. 创建密码
      [root@station5-237 ~]# echo password | passwd --stdin myteacher1
      Changing password for user myteacher1.
      passwd: all authentication tokens updated successfully.
      ....
      
    2. 开始处理共享目录的功能
      # a. 先创建 mystudent 群组的共享目录在 /srv/myshare 目录下
      [root@station5-237 ~]# cd /srv/
      [root@station5-237 srv]# mkdir myshare
      [root@station5-237 srv]# chgrp mystudent myshare
      [root@station5-237 srv]# chmod 2770 myshare/
      [root@station5-237 srv]# ll -d myshare/
      drwxrws---. 2 root mystudent 6 May 11 21:22 myshare/
      
      # b.c. 让老师拥有查找权,但是不能修改 (不用给 w 喔!)
      [root@station5-237 srv]# setfacl -m g:myteacher:rx myshare/
      [root@station5-237 srv]# setfacl -m d:g:myteacher:rx myshare/
      [root@station5-237 srv]# setfacl -m u:myteacher3:- myshare/
      [root@station5-237 srv]# getfacl myshare/
      # file: myshare/
      # owner: root
      # group: mystudent
      # flags: -s-
      user::rwx
      user:myteacher3:---
      group::rwx
      group:myteacher:r-x
      mask::rwx
      other::---
      default:user::rwx
      default:group::rwx
      default:group:myteacher:r-x
      default:mask::rwx
      default:other::---
      
  • 例题 10.4 课后练习
    1. 创建各种群组与帐号信息
      # a. 创建系统群组
      [root@station5-237 ~]# groupadd -r sysgroup
      [root@station5-237 ~]# grep sysgroup /etc/group
      sysgroup:x:974:
      
      # b. 创建系统帐号
      [root@station5-237 ~]# useradd -r -M -G sysgroup mysysuser1
      [root@station5-237 ~]# useradd -r -M -G sysgroup mysysuser2
      [root@station5-237 ~]# useradd -r -M -G sysgroup mysysuser3
      [root@station5-237 ~]# echo mysystem | passwd --stdin mysysuser1
      [root@station5-237 ~]# echo mysystem | passwd --stdin mysysuser2
      [root@station5-237 ~]# echo mysystem | passwd --stdin mysysuser3
      [root@station5-237 ~]# id mysysuser1
      uid=398(mysysuser1) gid=398(mysysuser1) groups=398(mysysuser1),974(sysgroup)
      # UID/GID 都小于 1000,且支持 sysgroup 这样!
      
      # c. 创建特定用户
      [root@station5-237 ~]# mkdir /remote
      [root@station5-237 ~]# useradd -d /remote/mysysuser4 mysysuser4
      [root@station5-237 ~]# ll -d /remote/mysysuser4
      drwx------. 4 mysysuser4 mysysuser4 89 May 11 21:45 /remote/mysysuser4
      [root@station5-237 ~]# echo mysysuser4 | passwd --stdin mysysuser4
      
      # d. 删除一般用户,但保留家目录:
      [root@station5-237 ~]# ll -d /home/linuxuser3
      drwx------. 3 1010 1012 78 May 11 15:50 /home/linuxuser3
      
      # e. 依据上述数据,完成用户的重建。其中,密码给予之前默认值
      [root@station5-237 ~]# groupadd -g 1012 linuxuser3
      [root@station5-237 ~]# ll -d /home/linuxuser3
      drwx------. 3 1010 linuxuser3 78 May 11 15:50 /home/linuxuser3
      # 因为 UID/GID 并没有相同,所以系统无法自动给予正确的 gid,所以要先设置原本的 GID
      
      [root@station5-237 ~]# useradd -u 1010 -g linuxuser3 linuxuser3
      useradd: warning: the home directory already exists.
      Not copying any file from skel directory into it.
      Creating mailbox file: File exists
      [root@station5-237 ~]# ll -d /home/linuxuser3
      drwx------. 3 linuxuser3 linuxuser3 78 May 11 15:50 /home/linuxuser3
      [root@station5-237 ~]# id linuxuser3
      uid=1010(linuxuser3) gid=1012(linuxuser3) groups=1012(linuxuser3)
      # 接下来,指定正确的 UID 号码与 gid 群组名称,就可以顺利建置这个帐号了!
      
      [root@station5-237 ~]# echo linuxuser3 | passwd --stdin linuxuser3
      
    2. 开始处理权限设置
      # a. 创建共享目录
      [root@station5-237 ~]# cd /opt
      [root@station5-237 opt]# mkdir sysdir
      [root@station5-237 opt]# chgrp sysgroup sysdir
      [root@station5-237 opt]# chmod 2770 sysdir/
      [root@station5-237 opt]# ll
      drwxrws---. 2 root sysgroup 6 May 11 21:52 sysdir
      
      # b. 设置 mysysuser4 的可查阅权限
      [root@station5-237 opt]# setfacl -m u:mysysuser4:rx sysdir/
      [root@station5-237 opt]# setfacl -m d:u:mysysuser4:rx sysdir/
      [root@station5-237 opt]# getfacl sysdir/
      # file: sysdir/
      # owner: root
      # group: sysgroup
      # flags: -s-
      user::rwx
      user:mysysuser4:r-x
      group::rwx
      mask::rwx
      other::---
      default:user::rwx
      default:user:mysysuser4:r-x
      default:group::rwx
      default:mask::rwx
      default:other::---
      
      # c. 拒绝 mysysuser3 的使用
      [root@station5-237 opt]# setfacl -m u:mysysuser3:- sysdir
      [root@station5-237 opt]# getfacl sysdir/
      # file: sysdir/
      # owner: root
      # group: sysgroup
      # flags: -s-
      user::rwx
      user:mysysuser3:---
      user:mysysuser4:r-x
      group::rwx
      mask::rwx
      other::---
      default:user::rwx
      default:user:mysysuser4:r-x
      default:group::rwx
      default:mask::rwx
      default:other::---
      
修改历史:
  • 2020/02/25:尝试直接在课程中加入解答,让大家有个参考依据。不过,没事不要来看啊!
  • 2020/03/10:加入了第三章的后课练习部份。
2020/03/02 以来统计人数
计数器
其他链接
环境工程模式篇
鸟园讨论区
鸟哥旧站

今日 人数统计
昨日 人数统计
本月 人数统计
上月 人数统计