IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 16.linux用户和组详解演练useraddusermodchageuserdelidsugroupspasswdshadowgroupgshadow等命令和文件 -> 正文阅读

[系统运维]16.linux用户和组详解演练useraddusermodchageuserdelidsugroupspasswdshadowgroupgshadow等命令和文件

前言

本小节会详细介绍用户和组的关系,UID和GID,初始组和附加组,同时详细介绍groups,passwd,shadow,group,gshadow,login.defs,useradd 等文件含义和使用,对常见的用户相关命令如useradd,usermod,chage,userdel,id,su,whoami,who am i,groupadd,groupmod,groupdel,gpasswd,newgrp等命令的使用方法和实际演练。



用户和组概览

用户和组概念

Linux 是多用户多任务操作系统,支持多个用户在同一时间内登陆,不同用户可以执行不同的任务,并且互不影响。
不同用户具有不问的权限,毎个用户在权限允许的范围内完成不间的任务,通过这种权限的划分与管理,实现了多用户多任务的运行机制。
每个用户都有用户名和密码。在登录系统时,需要输入用户名和密码进入系统和自己的主目录。

用户组是具有相同特征用户集合。例如当需要让多个用户具有相同的权限,建立一个组,让这个组具有查看、修改此文件的权限,然后将所有需要访问此文件的用户放入这个组中。那么,所有用户就具有了和组一样的权限,这就是用户组。

用户和组的关系

用户和用户组的对应关系有以下 4 种:
一对一:一个用户可存在一个组,是组中的唯一成员;
一对多:一个用户可以存在多个组中,此用户具有这多个组的权限;
多对一:多个用户存在一个组,这些用户具有和组相同的权限;
多对多:多个用户存在多个组中。
在这里插入图片描述

UID和GID

登陆系统时,输入用户名和密码,对于系统只认识用户名对应的 ID 。系统将用户名称与 ID 的对应关系存储在 /etc/passwd 中。

用户ID为2种,分别是用户 ID(UID)和组 ID(GID),每个文件都有自己的UID和GID。

/etc/passwd 文件中,UID 找到对应的用户名;
/etc/group 文件中,GID 找到对应的组名。

系统用户UID:1-999;普通用户UID:1000+。其中超级管理员的uid为0.

演示

  1. 查看用户uid,及文件所属用户

//可看到用户的uid是1005

[root@node1 ~]# grep -n 'hulk' /etc/passwd
35:hulk:x:1005:1005::/home/hulk:/bin/bash
 //可看到文件的所属所属用户是hulk
[root@node1 ~]# ll -d /home/hulk/  
drwx------ 2 hulk hulk 92 Jul 21 23:41 /home/hulk/
  1. 修改UID,再查看文件所属用户
将hulk的uid更改成为1006
[root@node1 ~]# grep -n 'hulk' /etc/passwd
35:hulk:x:1006:1005::/home/hulk:/bin/bash
之前的 hulk 因为修改了UID,导致 1005 找不到对应的账号,因此显示数字,不会显示用户名
[root@node1 ~]# ls -l /home/hulk/2 
-rw-rw-r-- 1 1005 hulk 0 Jul 21 23:40 /home/hulk/2
#记得最后将其再手动改正过来
[root@prometheus ~]# id
uid=0(root) gid=0(root) groups=0(root)

初始组和附加组

一个用户可以属于多个群组,拥有这些群组的权限,这就引出了初始组(主组)和附加组。

初始组

初始组(主组):当用户登陆系统,立刻就会拥有这个群组的相关权限;在创建文件的时候,文件显示的是这个初始组。主组是添加 用户时默认创建的群组当创建,用户不指定主组的时候,会自动创建跟用户名称相同的主组。

新建用户 mysql,并将其加入 dba 群组中,执行命令如下:

root@localhost ~]# useradd mysql  <--添加新用户
[root@localhost ~]# groupadd dba  <--添加新群组
[root@localhost ~]# usermod -G dba mysql  <--将用户mysql加入 users群组
[root@prometheus ~]# grep 'mysql' /etc/group <---mysql组的id是1000
mysql:x:1000:
dba:x:1001:mysql
[root@prometheus ~]# grep 'dba' /etc/group <--- dba的组id是1001
dba:x:1001:mysql

[root@prometheus ~]# grep 'mysq' /etc/passwd <--- passwd文件中的第 4 字段(GID)指的就是每个用户所属的主组,mysql用户的主组id是1000,也就是mysql用户的主组名是mysql。
mysql:x:1000:1000::/home/mysql:/bin/bash

[mysql@prometheus ~]$ touch 1
//文件属性对应的是用户的主组
[mysql@prometheus ~]$ ls -l
total 0
-rw-rw-r-- 1 mysql mysql 0 Nov 21 15:07 1

附加组

上个例子中虽然mysql用户的主组不是dba,但它也是属于dba这个组。所以看组文件的时候,会有关于mysql的成员信息。

[root@prometheus ~]# grep 'dba' /etc/group <--- dba的组id是1001
dba:x:1001:mysql

对于 mysql 用户同时属于 mysql 和dba 两个群组,所在,在读取\写入\运行文件时,只要是 mysql和 dba群组拥有的功能,mysql用户都拥有。
到此,我们已经学习了/etc/passwd、/etc/shadow、/etc/group,它们之间的关系可以这样理解,即先在 /etc/group 文件中查询用户组的 GID 和组名;然后在 /etc/passwd 文件中查找该 GID 是哪个用户的初始组,同时提取这个用户的用户名和 UID;最后通过 UID 到

groups

使用 groups 命令可以知道用户有多少个组。

[root@localhost ~]# su - mysql
[mysql@localhost ~]$ groups
mysql dba

通过输出信息可以得知,mysql用户同时属于 mysql群组和 dba 群组,而且,第一个出现的为用户的初始组,后面的都是附加组,所以 mysql用户的初始组为 mysql群组,附加组为 dba群组。

passwd文件详解

/etc/passwd 文件是用户配置文件,存储用户的基本信息,这个文件对所有用户提供只读权限

查看文件内容

[root@localhost ~]# cat /etc/passwd
#查看一下文件内容
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
...省略部分输出...

文件格式

每行信息以 :作为分隔符,划分成 7 个字段,每个字段所表示的含义如下:

root:x:0:0:root:/root:/bin/bash
用户名 密码 UID GID 描述性信息 主目录 默认Shell

用户名

Linux 系统通过 UID 来识别用户身份,分配用户权限的。/etc/passwd 文件中就定义了用户名和 UID 之间的对应关系。

密码

“x” 表示此用户设有密码,密码保存在 /etc/shadow 文件。 “x” 表示是否设置了密码,如果删除了 “x”,系统会认为这个用户没有密码,则用户可以免密钥登录。

UID

UID,用户 ID。每个用户有唯一的一个 UID,系统通过 UID 来识别不同的用户。操作系统版本不同,UID的保留范围也不同
UID 是一个 0~65535 之间的数,不同范围的数字表示不同的用户身份。

范围身份
0超级用户,0 超级用户。UID 为 0 就代表这个账号是管理员账号。在 Linux 中,把普通用户升级成管理员,只需把其他用户的 UID 修改为 0 就可以了,不建议操作
1-999系统用户(伪用户)。也就是说,此范围的 UID 保留给系统使用。其中,1~99 用于系统自行创建的账号;100~999 分配给有系统账号需求的用户。
1000~65535普通用户

GID

组ID,表示用户初始组的组 ID 号,也就是主组ID。

主目录

用户切换或者登录后的目录。有操作权限的访问目录,也称为用户的主目录。
root主目录为 /root,普通用户的默认主目录为 /home/用户名,即在 /home/ 目录下建立和用户名相同的目录作为主目录,如 mysql用户的主目录就是 /home/mysql/ 目录。

默认的Shell

Shell 命令解释器,是用户和 Linux 内核之间沟通的桥梁。Shell 命令解释器的功能就是将用户输入的命令转换成系统可以识别的机器语言。
通常Linux 系统默认使用的命令解释器是 bash(/bin/bash),也有其他命令解释器,例如 sh、csh 等。如果是bash,表示这个用户可以执行命令

[root@prometheus ~]# grep -i 'mysql' /etc/passwd
mysql:x:1000:1000::/home/mysql:/bin/bash
[root@prometheus ~]# su - mysql
Last login: Sun Nov 21 15:07:37 CST 2021 on pts/0
[mysql@prometheus ~]$ ls
1

如果把 mysql用户的 Shell 命令解释器修改为 /sbin/nologin,则这个用户就不能登录了,例如:

[root@prometheus ~]# grep -i 'mysql' /etc/passwd
mysql:x:1000:1000::/home/mysql:/sbin/nologin
[root@prometheus ~]# su - mysql
Last login: Sun Nov 21 21:51:58 CST 2021 on pts/0
This account is currently not available.

如果更改为指定命令,如 /usr/bin/passwd,例如:

[root@prometheus ~]# su - mysql
Last login: Sun Nov 21 21:55:20 CST 2021 on pts/0
/home/mysql
[root@prometheus ~]# 

可以看到当切换用户的时候,用户并没有登录,只是执行了这个用户passwd这个命令。

shadow文件详解

/etc/shadow 文件用于存储用户的密码信息,称为“影子文件”。
/etc/shadow 文件只有 root 用户拥有读权限,其他用户没有任何权限,这样就保证了用户密码的安全性。

文件格式

介绍此文件之前,我们先打开看看,执行如下命令:

[root@prometheus ~]# cat /etc/shadow
root:$6$k85NeopLTiGz4bS/$V0wa/dmxQu5/aI52iCwqWyAu5NTJcyPs0WKREJSTOsvVVlCvPymExcOx5s.f/2MdPRmmn09g7djbZ0FyryGYy1::0:99999:7:::
bin:*:18353:0:99999:7:::
daemon:*:18353:0:99999:7:::
adm:*:18353:0:99999:7:::
lp:*:18353:0:99999:7:::
sync:*:18353:0:99999:7:::
....

文件中每行代表一个用户,使用 : 作为分隔符,这一行九个字段含义:
用户名 加密密码 最后一次修改时间 最小修改时间间隔 密码有效期 密码需要变更前的警告天数 密码过期后的宽限时间 账号失效时间 保留字段

用户名

同 /etc/passwd 文件中用户名。

加密密码

保存真正加密的密码。目前密码采用的是 SHA512 散列加密算法。

所有伪用户的密码都是 !! 或 *,代表没有密码是不能登录的。当然,新创建的用户如果不设定密码,那么它的密码项也是 “!!”,代表这个用户没有密码,不能登录(可以通过root切换)。

[root@prometheus ~]# useradd zhangsan
[root@prometheus ~]# grep -i 'zhangsan' /etc/shadow
zhangsan:!!:18075:0:99999:7:::

最后一次修改时间

最后一次修改密码的时间,当前zhangsan用户显示的是 18075 ,因为时间是以 1970 年 1 月 1 日起始,不断累加+1得到的数值,18075 代表的是哪一天呢?可以使用如下命令进行换算:

[root@prometheus ~]# date -d "1970-01-01 18075 days"
Fri Jun 28 00:00:00 CST 2019

最小修改时间间隔

最小修改间隔时间,也就是说,该字段规定了从第 3 字段(最后一次修改密码的日期)起,多长时间之内不能修改密码。如果是 0,则密码可以随时修改;如果是 10,则代表密码修改后 10 天之内不能再次修改密码。

密码有效期

经常变更密码是个好习惯,为了强制要求用户变更密码,这个字段可以指定距离第 3 字段(最后一次更改密码)多长时间内需要再次变更密码,否则该账户密码进行过期阶段。
该字段的默认值为 99999,也就是 273 年,可认为是永久生效。如果改为 90,则表示密码被修改 90 天之后必须再次修改,否则该用户即将过期。通过这个字段强制用户定期修改密码。

密码需要变更前的警告天数

与第 5 字段相比较,当账户密码有效期快到时,系统会发出警告信息给此账户,提醒用户 “再过 n 天你的密码就要过期了,请尽快重新设置你的密码!”。
该字段的默认值是 7,也就是说,距离密码有效期的第 7 天开始,每次登录系统都会向该账户发出 “修改密码” 的警告信息。

密码过期后的宽限天数

也称为“口令失效日”,简单理解就是,在密码过期后,用户如果还是没有修改密码,则在此字段规定的宽限天数内,用户还是可以登录系统的;如果过了宽限天数,系统将不再让此账户登陆。
比如此字段规定的宽限天数是 10,则代表密码过期 10 天后失效;如果是 0,则代表密码过期后立即失效;如果是 -1,则代表密码永远不会失效。

账号失效时间

同第 3 个字段一样,使用自 1970 年 1 月 1 日以来的总天数作为账户的失效时间。该字段表示,账号在此字段规定的时间之外,不论你的密码是否过期,都将无法使用

group文件详解

/ect/group 文件是组配置文件,用户组的所有信息存放在此文件中。

文件格式

[root@prometheus ~]# grep -i 'dba' /etc/group
dba:x:1001:mysql,oracle
[root@prometheus ~]# grep -i 'mysql' /etc/group
mysql:x:1000:
dba:x:1001:mysql,oracle

每一行代表一个用户组。创建 的mysql 用户,系统默认生成一个 mysql 用户组,在此可以看到,此用户组的 GID 为 1000,目前它仅作为 mysql 用户的初始组。
以 “:” 作为字段之间的分隔符,分为 4 个字段,每个字段对应的含义为: 组名 密码 GID 该用户组中的用户列表

组名

也就是是用户组的名称,有字母或数字构成。组名不能重复。

组密码

和 /etc/passwd 文件一样,这里的 “x” 仅仅是密码标识,真正加密后的组密码默认保存在 /etc/gshadow 文件中。 很少设置组密码。

组ID (GID)

系统就是通过 GID 来区分用户组的。这里的 GID 与 /etc/passwd 文件中第 4 个字段的 GID 相对应,实际上,/etc/passwd 文件中使用 GID 对应的群组名,就是通过此文件对应得到的。

组中的附加用户

此字段列出每个群组包含的所有用户。如果该用户组是这个用户的初始组,则该用户不会写入这个字段,该字段显示的用户都是这个用户组的附加用户。

[root@prometheus ~]# grep -i 'mysql' /etc/group
mysql:x:1000:
dba:x:1001:mysql,oracle

第四个字段没有写入 mysql 用户,因为 mysql 组是 mysql 用户的初始组。
每个用户都可以加入多个附加组,但是只能属于一个初始组。一般情况下,用户的初始组就是在建立用户的同时建立的和用户名相同的组。

gshadow文件(了解)

组信息存储在 /etc/group 文件中,而将组的密码信息存储在/etc/gshadow 文件中。

文件格式

[root@localhost ~]#cat /etc/gshadow
root:::
bin:::bin, daemon
daemon:::bin, daemon
...省略部分输出...
mysql:!::

每行代表一个组的密码信息,各行信息用 “:” 作为分隔符分为 4 个字段,每个字段的含义如下:
组名:加密密码:组管理员:组附加用户列表

组名

同 /etc/group 文件中的组名相对应。

组密码

对于大多数用户来说,通常不设置组密码,因此该字段常为空,但有时为 “!”,指的是该群组没有组密码,也不设有群组管理员。

组管理员

从系统管理员的角度来说,该文件最大的功能就是创建群组管理员。那么,什么是群组管理员呢?
考虑到 Linux 系统中账号太多,而超级管理员 root 可能比较忙碌,因此当有用户想要加入某群组时,root 或许不能及时作出回应。这种情况下,如果有群组管理员,那么他就能将用户加入自己管理的群组中,也就免去麻烦 root 了。这个功能很少使用,因为可以使用sudo来操作。

组中的附加用户

该字段显示这个用户组中有哪些附加用户,和 /etc/group 文件中附加组显示内容相同。

login.defs文件(了解 )

login.defs文件用途

/etc/login.defs 文件用于在创建用户时,对用户的一些基本属性做默认设置,例如指定用户 UID 和 GID 的范围,用户的过期时间,密码的最大长度,等等。
该文件的用户默认配置对 root 用户无效。另外当此文件中的配置与 /etc/passwd 和 /etc/shadow 文件中的用户信息有冲突时,系统会以/etc/passwd 和 /etc/shadow 为准。

设置项

设置项含义
MAIL_DIR /var/spool/mail创建用户时,系统会在目录 /var/spool/mail 中创建一个用户邮箱,比如 mysql 用户的邮箱是 /var/spool/mail/mysql。
PASS_MAX_DAYS 99999密码有效期,99999 是自 1970 年 1 月 1 日起密码有效的天数,相当于 273 年,可理解为密码始终有效。
PASS_MIN_DAYS 0表示自上次修改密码以来,最少隔多少天后用户才能再次修改密码,默认值是 0。
PASS_MIN_LEN 5指定密码的最小长度,默认不小于 5 位,但是现在用户登录时验证已经被 PAM 模块取代,所以这个选项并不生效。
PASS_WARN_AGE 7指定在密码到期前多少天,系统就开始通过用户密码即将到期,默认为 7 天。
UID_MIN 500指定最小 UID 为 500,也就是说,添加用户时,默认 UID 从 500 开始。注意,如果手工指定了一个用户的 UID 是 550,那么下一个创建的用户的 UID 就会从 551 开始,哪怕 500~549 之间的 UID 没有使用。
UID_MAX 60000指定用户最大的 UID 为 60000。
GID_MIN 500指定最小 GID 为 500,也就是在添加组时,组的 GID 从 500 开始。
GID_MAX 60000用户 GID 最大为 60000。
CREATE_HOME yes指定在创建用户时,是否同时创建用户主目录,yes 表示创建,no 则不创建,默认是 yes。
UMASK 077用户主目录的权限默认设置为 077。
USERGROUPS_ENAB yes指定删除用户的时候是否同时删除用户组,准备地说,这里指的是删除用户的初始组,此项的默认值为 yes。
ENCRYPT_METHOD SHA512指定用户密码采用的加密规则,默认采用 SHA512,这是新的密码加密模式,原先的 Linux 只能用 DES 或 MD5 加密。

useradd命令

useradd: 用于创建新的用户
[root@localhost ~]#useradd [选项] 用户名

常用选项

选项含义
-u UID手工指定用户的 UID,注意 UID 的范围(不要小于 1000)。
-d 主目录手工指定用户的主目录。主目录必须写绝对路径,而且如果需要手工指定主目录,则一定要注意权限;
-c 用户说明手工指定/etc/passwd文件中各用户信息中第 5 个字段的描述性内容,可随意配置;
-g 组名手工指定用户的初始组。一般以和用户名相同的组作为用户的初始组,在创建用户时会默认建立初始组。
-G 组名指定用户的附加组。把用户加入其他组,使用附加组;
-s shell手工指定用户的登录 Shell,默认是 /bin/bash;
-e 曰期指定用户的失效曰期,格式为 “YYYY-MM-DD”。也就是 /etc/shadow 文件的第八个字段;
-o允许创建的用户的 UID 相同。例如,执行 “useradd -u 0 -o usertest” 命令建立用户 usertest,它的 UID 和 root 用户的 UID 相同,都是 0;
-m建立用户时强制建立用户的家目录。在建立系统用户时,该选项是默认的;
-r创建系统用户,也就是 UID 在 1~499 之间,供系统程序使用的用户。由于系统用户主要用于运行系统所需服务的权限配置,因此系统用户的创建默认不会创建主目录。

useradd mysql

系统已经设置了很多默认值,无需使用任何选项也可成功创建用户。

[root@zaishu ~]# useradd mysql
创建 mysql 用户。

这条会完成以下几项操作:

  1. 在 /etc/passwd 文件中创建一行与 mysql 用户相关的数据:
[root@zaishu ~]# grep -i 'mysql' /etc/passwd
mysql:x:1003:1003::/home/mysql:/bin/bash

可以看到,用户的 UID 是从 1000 开始计算的。同时默认指定了用户的家目录为 /home/mysql/,用户的登录 Shell 为 /bin/bash。

  1. 在 /etc/shadow 文件中新增了一行与 mysql 用户密码相关的数据:
[root@zaishu ~]# grep -i 'mysql' /etc/shadow
mysql:!!:18953:0:99999:7:::

用户还没有设置密码,所以密码字段是 “!!”,代表用户没有合理密码,不能正常登录。同时会按照默认值设定时间字段,例如密码有效期有 99999 天,距离密码过期 7 天系统会提示用户“密码即将过期”等。

  1. 在 /etc/group 文件中创建一行与用户名一样的组:
[root@zaishu ~]# grep -i 'mysql' /etc/group
mysql:x:1003:

该群组会作为新建用户的初始组。

  1. 在 /etc/gshadow 文件中新增一行与新增群组相关的密码信息:
[root@zaishu ~]# grep -i 'mysql' /etc/gshadow
mysql:!::

没有设定组密码,也没有组管理员。

  1. 默认创建用户的主目录和邮箱:
[root@zaishu ~]# ll -d /home/mysql/
drwx------ 3 mysql mysql 4096 1月6 00:19 /home/mysql/
[root@zaishu ~]#ll /var/spod/mail/mysql
-rw-rw---- 1 mysql mail 0 1月6 00:19 /var/spool/mail/mysql

useradd 命令创建用户的过程,是修改与用户相关的几个文件或目录.

useradd 执行选项

除了默认创建用户,在创建用户的时候,指定选项。

[root@zaishu ~]# groupadd mysql1  //创建组
[root@zaishu ~]# useradd -u 1100 -g mysql1 -G root -d /home/mysql1 -c "test user" -s /bin/bash mysql1

#建立mysql1用户,指定UID(1100 )、初始组(mysql1)、附加组(root)、家目录(/home/mysql1/)、用户说明(test user)和用户登录Shell(/bin/bash)

[root@zaishu ~]# grep 'mysql1' /etc/passwd
mysql1:x:1100:1004:test user:/home/mysql1:/bin/bash
#用户的UID、初始组、用户说明、家目录和登录Shell都和命令手工指定的一致
[root@zaishu ~]# grep 'mysql1' /etc/shadow
mysql1:!!:18953:0:99999:7:::
#mysql1用户还没有设定密码
[root@zaishu ~]# grep 'mysql1' /etc/group
root:x:0:mysql1
mysql1:x:1004:
#mysql1用户加入了root组,root组是mysql1用户的附加组
#GID为1004的组是mysql1组
[root@zaishu ~]# ll -d /home/mysql1
drwx------ 2 mysql1 mysql1 62 Nov 22 17:22 /home/mysql1
#自动建立家目录

手工创建用户

useradd 命令创建用户的过程,系统首先读取 /etc/login.defs 和 /etc/default/useradd,根据这两个配置文件中定义的规则添加用户,向 /etc/passwd、/etc/group、/etc/shadow、/etc/gshadow 文件中添加用户数据,接着系统会自动在 /etc/default/useradd 文件设定的目录下建立用户主目录,最后复制 /etc/skel 目录中的所有文件到此主目录中,由此,一个新的用户就创建完成了。明白原理完全可以手动创建用户。

/etc/default/useradd 文件

创建用户的时候可以指定任何参数,通过默认值得到相关配置。默认值文件有两个,分别是 /etc/default/useradd 和 /etc/login.defs。上一段落讲过 /etc/login.defs,在这一段详细讲解 /etc/default/useradd 文件。

文件格式

首先,使用 Vim 命令查看 /etc/default/useradd 文件中包含哪些内容:

[root@zaishu ~]# cat /etc/default/useradd 
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

或者通过命令行查看
useradd -D
-D 选项指的就是查看新建用户的默认值。

[root@zaishu ~]# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

设置项

参数含义
GR0UP=100这个选项用于建立用户的默认组,在添加每个用户时,用户的初始组就是 GID 为 100 的这个用户组。但 CentOS 是在添加用户时会自动建立和用户名相同的组作为此用户的初始组。也就是说这个选项并不会生效。
Linux中默认用户组有两种机制:一种是私有用户组机制,会创建一个和用户名相同的用户组作为用户的初始组;另一种是公共用户组机制,系统用 GID 是 100 的用户组作为所有新建用户的初始组。默认采用的是私有用户组机制。
HOME=/home指的是用户主目录的默认位置,所有新建用户的主目录默认都在 /home/下,刚刚新建的 mysql1 用户的主目录就为 /home/mysql1/。
INACTIVE=-1指的是密码过期后的宽限天数,也就是 /etc/shadow 文件的第七个字段。这里默认值是 -1,代表所有新建立的用户密码永远不会失效。
EXPIRE=表示密码失效时间,也就是 /etc/shadow 文件的第八个字段。默认值是空,代表所有新建用户没有失效时间,永久有效。
SHELL=/bin/bash表示所有新建立的用户默认 Shell 都是 /bin/bash。
SKEL=/etc/skel在创建一个新用户后,你会发现,该用户主目录并不是空目录,而是有 .bash_profile、.bashrc 等文件,这些文件都是从 /etc/skel 目录中自动复制过来的。因此,更改 /etc/skel 目录下的内容就可以改变新建用户默认主目录中的配置文件信息。
CREATE_MAIL_SPOOL=yes指的是给新建用户建立邮箱,默认是创建。也就是说,对于所有的新建用户,系统都会新建一个邮箱,放在 /var/spool/mail/ 目录下,和用户名相同。例如,mysql1 的邮箱位于 /var/spool/mail/mysql1。

修改默认设置

修改方式有 2 种,一种Vim 文本编辑器修改,另一种使用useradd 命令修改

useradd -D [选项] 参数
用此命令修改 /etc/default/useradd 文件

选项含义
-b HOME设置所创建的主目录所在的默认目录,只需用目录名替换 HOME 即可,例如 useradd -D -b /gargae。
-e EXPIRE设置密码失效时间,EXPIRE 参数应使用 YYYY-MM-DD 格式,例如 useradd -D -e 2019-10-17。
-f INACTIVE设置密码过期的宽限天数,例如 useradd -D -f 7。
-g GROUP设置新用户所在的初始组,例如 useradd -D -g bear。
-s SHELL设置新用户的默认 shell,SHELL 必须是完整路径,例如 useradd -D -s /usr/bin/csh。

修改新用户默认 Shell 为 /bin/csh:

[root@zaishu ~]# useradd -D -s /bin/csh
[root@zaishu ~]# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/csh
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

其他一些默认值,例如修改用户默认的 UID、GID,以及密码的设置,对这些默认值需要在 /etc/login.defs 文件中修改

passwd命令

passwd 用于设置密码的命令 。

常用选项

[root@localhost ~]#passwd [选项] 用户名
选项|含义
|-S:|查询用户密码的状态,也就是 /etc/shadow 文件中此用户密码的内容。仅 root 用户可用;
|-l:|暂时锁定用户,该选项会在 /etc/shadow 文件中指定用户的加密密码串前添加 “!”,使密码失效。
|-u:|解锁用户,和 -l 选项相对应,也是只能 root 用户使用;
|–stdin:|可以将通过管道符输出的数据作为用户的密码。主要在批量添加用户时使用;
|-n 天数:|设置该用户修改密码后,多长时间不能再次修改密码,也就是修改 /etc/shadow 文件中各行密码的第 4 个字段;
|-x 天数:|设置该用户的密码有效期,对应 /etc/shadow 文件中各行密码的第 5 个字段;
|-w 天数:|设置用户密码过期前的警告天数,对于 /etc/shadow 文件中各行密码的第 6 个字段;
|-i 日期:|设置用户密码失效日期,对应 /etc/shadow 文件中各行密码的第 7 个字段。

修改密码

[root@zaishu~]#passwd mysql
Changing password for user mysql.
New password:  // 直接输入新的口令
BAD PASSWORD: it is WAY too short  // 口令太简单或过短的警告信息
Retype new password:  // 再次验证输入的密码,再输入一次即可
passwd: all authentication tokens updated successfully.   // 修改成功
[root@zaishu~]#passwd //修改当前用户密码
注意,普通用户只能使用 passwd 命令修改自己的密码,而不能修改其他用户的密码。

查看密码属性

[root@zaishu~]# passwd -S mysql
mysql PS 2021-01-06 0 99999 7 -1 (Password set, SHA512 crypt.)
用户名 密码 设定时间(2021 01 06) 密码修改间隔时间(0) 密码有效期(99999) 警告时间(7) 密码不失效(-1),密码已使用

修改密码属性

通过命令选项修改密码属性,例如#修改 mysql的密码,使其具有 60 天变更、10 天密码失效

[root@zaishu~]# passwd -x 60 -i 10 mysql
[root@zaishu~]# passwd -S mysql
mysql PS 2021-01-06 0 60 7 10 (Password set, SHA512 crypt.)

锁定 mysql 用户

[root@zaishu ~]# passwd -l mysql
Locking password for user mysql.
passwd: Success

#用"-S"选项査看状态,很清楚地提示密码已被锁定
[root@zaishu ~]# passwd -S mysql
mysql LK 2021-11-22 0 99999 7 -1 (Password locked.)

解锁mysql

锁定 用户后,用户就不能登录系统。需要解锁使用如下命令即可:
#解锁 mysql 用户

[root@zaishu ~]# passwd -u mysql
Unlocking password for user mysql.
passwd:Success
[root@localhost ~]# passwd -S mysql
mysql PS2021-11-22 0 99999 7 -1(Password set, SHA512 crypt.)

管道符修改密码

passwd 命令提供了 --stdin 选项,用于批量给用户设置初始密码。

[root@在数~]# echo "zaishu.cn" | passwd --stdin mysql
Changing password for user mysql.
passwd: all authentication tokens updated successfully.

usermod

Linux usermod命令:修改用户信息

常用选项

[root@zaishu ~]#usermod [选项] 用户名

选项含义
-c 用户说明修改用户的说明信息,即修改 /etc/passwd 文件目标用户信息的第 5 个字段;
-d 主目录修改用户的主目录,即修改 /etc/passwd 文件中目标用户信息的第 6 个字段,需要注意的是,主目录必须写绝对路径;
-e 日期修改用户的失效曰期,格式为 “YYYY-MM-DD”,即修改 /etc/shadow 文件目标用户密码信息的第 8 个字段;
-g 组名修改用户的初始组,即修改 /etc/passwd 文件目标用户信息的第 4 个字段(GID);
-u UID修改用户的UID,即修改 /etc/passwd 文件目标用户信息的第 3 个字段(UID);
-G 组名修改用户的附加组,其实就是把用户加入其他用户组,即修改 /etc/group 文件;
-l 用户名修改用户名称;
-L临时锁定用户(Lock);
-U解锁用户(Unlock),和 -L 对应;
-s shell:修改用户的登录 Shell,默认是 /bin/bash。

接下来,给大家分别讲解 usermod 命令几个选项的具体用法。

锁定用户

对用户的临时锁定,同 passwd 命令一样,在 /etc/passwd 文件目标用户的加密密码字段前添加 “!”,使密码失效

[root@zaishu ~]# usermod -L mysql1
[root@zaishu ~]# grep 'mysql1' /etc/shadow
mysql1:!$6$w4ctx1dF$ArGbKhuQ/.V9mZdzk.oT3smRYDWbrvWQ2DChGbRFa5RaqpW5ti399p/SQqXqInKvOk6r5bJ8/ApC.oSn1ZRyT1:18954:0:99999:7:::

解锁用户

取消了密码字段前的 “!”
[root@zaishu ~]# usermod -U mysql1
[root@zaishu ~]# grep ‘mysql1’ /etc/shadow
mysql1: 6 6 6w4ctx1dF$ArGbKhuQ/.V9mZdzk.oT3smRYDWbrvWQ2DChGbRFa5RaqpW5ti399p/SQqXqInKvOk6r5bJ8/ApC.oSn1ZRyT1:18954:0:99999:7:::

添加附加组

mysql1用户加入root组

[root@zaishu ~]# usermod -G root mysql1
[root@zaishu ~]# grep 'mysql1' /etc/group
root:x:0:mysql1  //mysql用户已经加入了root组

修改用户说明

[root@zaishu ~]# usermod -c 'test test'  mysql1
[root@zaishu ~]# grep 'mysql1' /etc/passwd
mysql1:x:1100:1004:test test:/home/mysql1:/bin/bash //说明已经被修改

Linux chage

修改用户密码状态
chage 命令 显示更加详细的用户密码信息,并且和 passwd 命令一样,可以修改用户密码。chage 常和 passwd 批量初始化用户密码功能结合使用。

常用选项

[root@zaishu ~]#chage [选项] 用户名

选项含义
-l列出用户的详细密码状态;
-d 日期修改 /etc/shadow 文件中指定用户密码信息的第 3 个字段,也就是最后一次修改密码的日期,格式为 YYYY-MM-DD;
-m 天数修改密码最短保留的天数,也就是 /etc/shadow 文件中的第 4 个字段;
-M 天数修改密码的有效期,也就是 /etc/shadow 文件中的第 5 个字段;
-W 天数修改密码到期前的警告天数,也就是 /etc/shadow 文件中的第 6 个字段;
-i 天数修改密码过期后的宽限天数,也就是 /etc/shadow 文件中的第 7 个字段;
-E 日期修改账号失效日期,格式为 YYYY-MM-DD,也就是 /etc/shadow 文件中的第 8 个字段。

查看用户密码状态

[root@zaishu ~]# chage -l mysql1
Last password change					: Nov 23, 2021
Password expires					: never
Password inactive					: never
Account expires						: never
Minimum number of days between password change		: 0
Maximum number of days between password change		: 99999
Number of days of warning before password expires	: 7

配置初始密码强制修改

chage 更大的用途是强制用户在第一次登录后,必须先修改密码,用新密码重新登陆系统

  1. 添加用户,配置初始密码
[root@zaishu ~]# useradd oracle
[root@zaishu ~]# echo 'oracle' | passwd --stdin oracle
Changing password for user oracle.
passwd: all authentication tokens updated successfully.
  1. 设置初始密码强制修改
    chage命令设置账号密码创建日期为 1970 年 1 月 1 日(0 表示这一天),这样用户登陆后就必须修改密码。
[root@zaishu ~]# chage -d 0 oracle
  1. 验证
[mysql@zaishu ~]$ su - oracle
Password: 	//输入初始密码
You are required to change your password immediately (root enforced)
Changing password for oracle.
(current) UNIX password:   //输入初始密码
New password: 	//设置新密码
Retype new password: 
Last failed login: Tue Nov 23 09:59:10 CST 2021 on pts/2

userdel

用于删除用户,只有 root 用户可以使用。

常用选项

[root@zaishu ~]# userdel -r 用户名
-f:强制删除用户,即使用户当前已登录;
-r:删除用户,并且删除家目录和其它用户相关目录。

手工删除用户

用户基本信息:存储在 /etc/passwd 文件中;
用户密码信息:存储在 /etc/shadow 文件中;
用户群组基本信息:存储在 /etc/group 文件中;
用户群组信息:存储在 /etc/gshadow 文件中;
用户个人文件:主目录默认位于 /home/用户名,邮箱位于 /var/spool/mail/用户名。
userdel 命令的作用就是从以上文件中,删除与指定用户有关的数据信息。除了使用 userdel 命令删除用户,还可以手动方式删除。

手动删除指定用户的具体操作如下:
删除oracle用户

[mysql@zaishu ~]$ id oracle
uid=1101(oracle) gid=1101(oracle) groups=1101(oracle)

1. /etc/passwd

[root@zaishu ~]# sed -i /oracle/'d' /etc/passwd  //删除oracle的行

2. /etc/shadow

[root@zaishu ~]# sed -i /oracle/'d' /etc/shadow //删除oracle的行

3. /etc/group

[root@zaishu ~]# sed -i /oracle/'d' /etc/group //删除oracle的行

4. /etc/gshadow

[root@zaishu ~]# sed -i /oracle/'d' /etc/gshadow //删除oracle的行

5. 删除目录

[root@zaishu ~]# rm -rf /var/spool/mail/oracle   #删除用户邮箱
[root@zaishu ~]# rm -rf /home/oracle/ #删除用户的家目录

用户彻底删除,可再重新新建用户mysql。

id命令

查看用户的UID和GID。id 命令可以查询用户UID、GID 和附加组的信息。
[root@localhost ~]# id 用户名

[root@localhost ~]# id mysql
uid=1001(mysql) gid=1001(mysql) groups=1001(mysql)
#能看到uid(用户ID)、gid(初始组ID), groups是用户所在所有组
[root@localhost ~]# usermod -G root mysql
#把用户加入root组
[root@localhost ~]# id mysql
uid=1001(mysql) gid=1001(mysql) groups=1001(mysql),0(root)
#大家发现root组中加入了mysql用户的附加组信息

su

su 是用户切换命令,注意从 root 用户切换至其他用户,不需要输入密码切换。

选项

[root@localhost ~]# su [选项] 用户名

选项含义
-当前用户切换为指定用户身份,同时所用的工作环境也切换为此用户的环境(包括 PATH 变量、MAIL 变量等),su - 不加用户名,会切换为 root 用户。
-l同 - 的使用类似,也就是在切换用户身份的同时,完整切换工作环境,但后面需要添加欲切换的使用者账号。
-p / -m表示切换为指定用户的身份,但不改变当前的工作环境(不使用切换用户的配置文件)。
-c 命令仅切换用户执行一次命令,执行后自动切换回来,该选项后通常会带有要执行的命令。

最常见切换形式

[mysql@localhost ~]$ su -root  //代表连带环境变量一起切换,不能省略
密码: 

仅执行命令

[mysql@localhost ~]$ whoami
mysql
[mysql@localhost ~]$ su - -c "useradd user1" root
密码:
#不切换成root,但是用root执行useradd命令添加user1用户
[mysql@localhost ~]$ whoami
mysql
#我还是mysql

su 和 su - 的区别

使用 su 命令时,有 - 和没有 - 是完全不同的,- 选项表示在切换用户身份的同时,连当前使用的环境变量也切换成指定用户的。我们知道,环境变量是用来定义操作系统环境的,因此如果系统环境没有随用户身份切换,很多命令无法正确执行。

  1. 切换到root用户
[mysql@zaishu ~]$ su root
密码:
<-输入root密码
#切换到root,但是没有切换环境变量。注意:普通用户切换到root需要密码
  1. 查看环境变量,还是mysql用户的环境变量
[root@zaishu ~]# env | grep mysql
#查看环境变量
USER=mysql
#用户名还是mysql,而不是root
PATH=/usr/lib/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/mysql/bin
#命令査找的路径不包含超级用户路径
MAIL=/var/spool/mail/mysql
PWD=/home/mysql
LOGNAME=mysql
#邮箱、主目录、目前用户名还是mysql

可以看到,在不使用 su - 的情况下,虽然用户身份成功切换,但环境变量依旧用的是原用户的,切换并不完整。

whoami和who am i

whoami 命令和 who am i 命令是不同的 2 个命令,前者用来打印当前执行操作的用户名,后者则用来打印登陆当前 Linux 系统的用户名。
为地区分这 2 个命令的功能,举例如下:

举例示范

  1. 切换之前查看
[Zhang@localhost ~]$ whoami
Zhang
[Zhang@localhost ~]$ who am i
Zhang    pts/0    2017-10-09 15:30 (:0.0)
  1. 切换用户
    在此基础上,使用 su 命令切换到 root 用户下,再执行一遍上面的命令:
[Zhang@localhost ~] su - root
[root@localhost ~]$ whoami
root
[root@localhost ~]$ who am i
Zhang    pts/0    2017-10-09 15:30 (:0.0)

在未切换用户身份之前,whoami 和 who am i 命令的输出是一样的,但使用 su 命令切换用户身份后,使用 whoami 命令打印的是切换后的用户名,而 who am i 命令打印的仍旧是登陆系统时所用的用户名。

实际用户和有效用户

使用 su 或者 sudo 命令切换用户身份,骗得过 whoami,但骗不过 who am i。要解释这背后的运行机制,需要搞清楚什么是实际用户(UID)和有效用户(EUID,即 Effective UID)。

所谓实际用户,指的是登陆 Linux 系统时所使用的用户,因此在整个登陆会话过程中,实际用户是不会发生变化的;而有效用户,指的是当前执行操作的用户,也就是说真正决定权限高低的用户,这个是能够利用 su 或者 sudo 命令进行任意切换的。

一般情况下,实际用户和有效用户是相同的,如果出现用户身份切换的情况,它们会出现差异。

应用场景

那么,whoami 和 who am i通常应用在哪些场景中呢?通常,对那些经常需要切换用户的系统管理员来说,经常需要明确当前使用的是什么身份;另外,对于某些 shell 脚本,或者需要特别的用户才能执行,这时就需要利用 whoami 命令来搞清楚执行它的用户是谁;甚至还有一些 shell 脚本,一定要某个特别用户才能执行,即便使用 su 或者 sudo 命令切换到此身份都不行,此时就需要利用 who am i 来确认。

groupadd

添加用户组

选项

[root@zaishu ~]# groupadd [选项] 组名
选项:
-g GID:指定组 ID;
-r:创建系统群组。

[root@zaishu ~]# groupadd group1
#添加group1组
[root@zaishu ~]# grep "group1" /etc/group
/etc/group:group1:x:1005:
/etc/gshadow:group1:!::

groupmod

修改用户组

选项

[root@localhost ~]# groupmod [选项] 组名
选项:
-g GID:修改组 ID;
-n 新组名:修改组名;

例子:

[root@localhost ~]# groupmod -n testgrp group1
#把组名group1修改为testgrp
[root@localhost ~]# grep "testgrp" /etc/group
testgrp:x:1005:
#注意GID还是1005,但是组名已经改变

groupdel

刪除用户组
[root@localhost ~]#groupdel 组名
使用 groupdel 命令删除群组,其实就是删除 /etc/group 文件和 /etc/gshadow 文件中有关目标群组的数据信息。

[root@localhost ~]#grep "group1" /etc/group /etc/gshadow
/etc/group:group1:x:505:
/etc/gshadow:group1:!::
[root@localhost ~]#groupdel group1
[root@localhost ~]#grep "group1" /etc/group /etc/gshadow
[root@localhost ~]#

如果有群组还是某用户的初始群组,无法使用 groupdel 命令删除。

[root@localhost ~]# useradd temp
#运行如下命令temp 用户建立的同时,还创建了 temp 群组,且将其作为 temp用户的初始组
[root@localhost ~]# grep "temp" /etc/passwd /etc/group /etc/gshadow
/etc/passwd:temp:x:505:505::/home/temp:/bin/bash
/etc/group:temp:x:505:
/etc/gshadow:temp:!::
#下面尝试删除 temp 群组
[root@localhost ~]# groupdel temp
groupdel:cannot remove the primary group of user 'temp'

如果要删除初始组,要么修改 用户的 GID,将其初始组改为其他群组,要么先删除 用户。

gpasswd

可以使用 gpasswd 命令给群组设置一个群组管理员,代替 root 完成将用户加入或移出群组的操作。

选项

[root@zaishu ~]# gpasswd 选项 组名

设置项含义
选项为空时表示给群组设置密码。
-A u1,…将群组的控制权交给 u1,… 等用户管理,设置 u1,… 等用户为群组的管理员
-M u1,…将 u1,… 加入到此群组中,仅 root 用户可用。
-r移除群组的密码
-R让群组的密码失效
-a user将 user 用户加入到群组中。
-d user将 user 用户从群组中移除。

示范

1. 设置组的管理员

[root@prometheus ~]# groupadd grp1  //创建grp1
[root@prometheus ~]# gpasswd grp1 // 设置组密码
Changing the password for group grp1  
New Password: 
Re-enter new password: 

[root@prometheus ~]# gpasswd -A mysql grp1 
// 添加组grp1的管理员

[root@prometheus ~]# grep 'grp' /etc/gshadow 
//查看组密码文件,可看到mysql 用户即为 grp1组的管理员。
grp1:$6$cfXLu/RIT3ZzR1l$em3s7eJiTlI9rhr8CL.7LInPaD0C/oQY2895eSrvjLNEfgnAnijb3/zSvHnsydGLjNq0x7o2XbJSmnABp4Kn/.:mysql:

2. 添加组成员(用添加的组管理员)
使用mysql将 oracle加入grp1组。

[root@prometheus ~]# su - mysql
[mysql@prometheus ~]# gpasswd -a oracle grp1
Adding user oracle to group grp1
[mysql@prometheus ~]# grep 'grp1' /etc/group
grp1:x:1004:oracle

使用root用户的usermod -G 命令也可以将用户加入群组。

newgrp

含义和用途

每个用户可以属于一个初始组,和多个附加组。既然用户可以属于这么多用户组,那么用户在创建文件后,默认生效的组身份是初始组(主组),用户属于多个用户组,可以使用命令 newgrp 切换初始组。

newgrp的用途是切换用户的有效组,可以从用户的附加组中选择一个组,作为用户的初始组。此命令的基本格式如下:
[root@localhost ~]# newgrp 组名

示例

  1. 创建组
[root@zaishu ~]# groupadd group1
[root@zaishu ~]# groupadd group2
[root@zaishu ~]# groupadd group3
  1. 创建用户
    创建用户 user1,初始组为 group1,附加组为 group2 和 group3
[root@localhost ~]# useradd -g group1 -G group2,group3 user1
[root@localhost ~]# more /etc/group | grep user1
group2:x:501:user1
group3:x:1005:user1
  1. newgrp
    使用 newgrp 命令切换 user1 的初始组
[user1@localhost ~]# mkdir user1_doc
[user1@localhost ~]# newgrp group2
[user1@localhost ~]# mkdir user2_doc
[user1@localhost ~]# newgrp group3
[user1@localhost ~]# mkdir user3_doc
  1. 查看文件信息
    通过使用 newgrp 命令切换用户的初始组,所创建的文件各自属于不同的群组。
[user1@localhost ~]# ll
total 12
drwxr-xr-x 2 user1 group1 4096 Oct 24 01:18 user1_doc
drwxr-xr-x 2 user1 group2 4096 Oct 24 01:18 user2_doc
drwxr-xr-x 2 user1 group3 4096 Oct 24 01:19 user3_doc

newgrp底层实现原理

newgrp 命令每一次切换用户的初始组,该用户都会以另外一个 shell登陆,在新 shell 上登陆的该用户,其初始组改变了而已。
每次使用 newgrp 命令,都会切换到一个新的进程。

[user1@localhost ~]$ 
[user1@localhost ~]$ echo $$
1181
[user1@localhost ~]$ newgrp group2
[user1@localhost~]$ echo $$
1200

使用 newgrp 命令切换用户初始组的整个过程,如图 所示:在这里插入图片描述
每一次使用 newgrp 切换用户的初始组,用户都会切换到一个新的子 shell 中,user1 用户的初始组从最初的 group1,切换成了 group2,再切换成 group3。
回到原本的环境,需要通过 exit 命令回退到当前进程的父进程。


总结

本小节会详细介绍用户和组的关系,UID和GID,初始组和附加组,同时详细介绍groups,passwd,shadow,group,gshadow,login.defs,useradd 等文件含义和使用,对常见的用户相关命令如useradd,usermod,chage,userdel,id,su,whoami,who am i,groupadd,groupmod,groupdel,gpasswd,newgrp等命令的使用方法和实际演练

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-11-24 08:22:22  更:2021-11-24 08:23:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 0:30:52-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码