linux用户和用户组管理
用户和用户组管理,顾名思义就是添加用户和用户组、更改密码和设定权限等操作。可能有很多人觉得用户管理没有意义,因为我们在使用个人计算机的时候,不管执行什么操作,都以管理员账户登录,而从来没有添加和使用过其他普通用户。这样做对个人计算机来讲问题不大,不过在服务器上是行不通的。大家想象一下,我们是一个管理团队,共同维护一组服务器,难道每个人都能够被赋子管理员权限吗?显然是不行的,因为不是所有的数据都可以对每位管理员公开,而且如果在运维团队中有某位管理员对 Linux 不热悉,那么赋子他管理员权限的后果可能是灾难性的。所以,越是对安全性要求高的服务器,越需要建立合理的用户权限等级制度和服务器操作规范。
用户配置文件和管理相关文件
我们已经知道 Linux 中的所有内容都是文件,所有内容如果想要永久生效,都需要保存到文件中,那么用户信息当然也要保存到文件中。我们需要先掌握这些和用户管理相关的文件。
/etc/passwd
用户信息文件 这个文件中保存的就是系统中所有的用户和用户的主要信息。我们打开这个文件来看看内容到底是什么。
[root@localhost ~]# vi /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
...省略部分输出...
这个文件的内容非常规律,每行代表一个用户。大家可能会比较惊讶,Linux 系统中默认怎么会有这么多的用户啊!这些用户中的绝大多数是系统或服务正常运行所必需的用户,我们把这种用户称为系统用户或伪用户。系统用户是不能登录系统的,但是这些用户同样也不能被删除,因为一旦删除,依赖这些用户运行的服务或程序就不能正常执行,会导致系统问题。
那么我们就把 root 用户这一行拿出来,看看这个文件中的内容具体代表的含义吧。我们会注意到,这个文件用“:”作为分隔符,划分为7 个字段,我们逐个来看具体的含义。
- 用户名称
第一个字段中保存的是用户名称。不过大家需要注意,用户名称只是为了方便管理员记忆,Linux 系统是通过用户 ID(UID)来区分不同用户、分配用户权限的。而用户名称和 UID 的对应正是通过 /etc/passwd
这个文件来定义的。
- 密码标志
这里我们说“x”代表的是密码标志,而不是真正的密码,真正的密码是保存在 /etc/shadow
文件中的。在早期的 UNIX 中,这里保存的就是真正的加密密码串,但是这个文件的权限是644,查询命令如下:
[root@localhost ~]# ll /etc/passwd
-rw-r--r-- 1 root root 1648 12月 29 00:17 /etc/passwd
所有用户都可以读取 /etc/passwd
文件,这样非常容易导致密码的泄露。虽然密码是加密的,但是采用暴力破解的方式也是能够进行破解的。所以现在的 Linux 系统把真正的加密密码串放置在影子文件 /etc/shadow
中,而影子文件的权限是 000,查询命令如下:
[root@localhost ~]# ll /etc/shadow
---------- 1 root root 1028 12月 29 00:18 /etc/shadow
这个文件是没有任何权限的,但因为我是 root 用户,所以读取权限不受限制。当然,用强制修改的方法也是可以手工修改这个文件的内容的。只有 root 用户可以浏览和操作这个文件,这样就最大限度地保证了密码的安全。
所以在 /etc/passwd
中只有一个“x”代表用户是拥有密码的,我们把这个字段称作密码标志,具体的密码要去 /etc/shadow
文件中查询。但是这个密码标志“x”也是不能被删除的,如果删除了密码标志“x”,那么系统会认为这个用户没有密码,从而导致只输入用户名而不用输入密码就可以登录(当然只能在本机上使用无密码登录,远程是不可以的),除非特殊情况(如破解用户密码),这当然是不可行的。
- UID
第三个字段就是 用户ID(UID),我们已经知道系统是通过 UID 来识别不同的用户和分配用户权限的。这些 UID 是有使用限制和要求的,我们需要了解。
- 0:超级用户 UID。如果用户 UID 为 0,则代表这个账号是管理员账号。在 Linux 中如何把普通用户升级成管理员呢?只需把其他用户的 UID 修改为 0 就可以了,这一点和 Windows 是不同的。不过不建议建立多个管理员账号。
- 1~499:系统用户(伪用户)UID。这些 UID 是系统保留给系统用户的 UID,也就是说 UID 是1~499 范围内的用户是不能登录系统的,而是用来运行系统或服务的。其中,1~99 是系统保留的账号,系统自动创建;100~499 是预留给用户创建系统账号的。
- 500~65535:普通用户 UID。建立的普通用户 UID 从 500 开始,最大到 65535。
这些用户足够使用了,但是如果不够也不用害怕,2.6.x 内核以后的 Linux 系统用户 UID 已经可以支持 2^32个用户了。
- GID
第四个字段就是用户的 组ID(GID),也就是这个用户的初始组的标志号。这里需要解释一下初始组和附加组的概念。
所谓初始组,指用户一登录就立刻拥有这个用户组的相关权限。每个用户的初始组只能有一个,一般就是将和这个用户的用户名相同的组名作为这个用户的初始组。举例来说,我们手工添加用户 lamp,在建立用户 lamp 的同时就会建立 lamp 组作为 lamp 用户的初始组。
所谓附加组,指用户可以加入多个其他的用户组,并拥有这些组的权限。每个用户只能有一个初始组,除初始组要把用户再加入其他的用户组外,这些用户组就是这个用户的附加组。
附加组可以有多个,而且用户可以有这些附加组的权限。举例来说,刚刚的 lamp 用户除属于初始组 lamp 外,我又把它加入了 users 组,那么 lamp 用户同时属于 lamp 组、users 组,其中 lamp 是初始组,users 是附加组。当然,初始组和附加组的身份是可以修改的,但是我们在工作中一般不修改初始组,只修改附加组,因为修改了初始组有时会让管理员逻辑混乱。
注意
在 /etc/passwd
文件的第四个字段中看到的 ID 是这个用户的初始组。
- 用户说明
第五个字段是这个用户的简单说明,没有什么特殊作用,可以不写。
- 家目录
第六个字段是这个用户的家目录,也就是用户登录后有操作权限的访问目录,我们把这个目录称为用户的家目录。超级用户的家目录是 /root
目录,普通用户在 /home/
目录下建立和用户名相同的目录作为家目录,如 lamp 用户的家目录就是 /home/lamp/
目录。
- 登录之后的 Shell
Shell 就是 Linux 的命令解释器。管理员输入的密码都是 ASCII 码,也就是类似 abed 的英文。但是系统可以识别的编码是类似 0101 的机器语言。Shell 的作用就是把 ASCII 编码的命令翻译成系统可以识别的机器语言,同时把系统的执行结果翻译为用户可以识别的 ASCI 编码。Linux 的标准 Shell 就是 /bin/bash
。
在 /etc/passwd
文件中,大家可以把这个字段理解为用户登录之后所拥有的权限。如果写入的是 Linux 的标准 Shell,/bin/bash
就代表这个用户拥有权限范围内的所有权限。例如:
[root@localhost ~]# vi /etc/passwd
lamp:x:502:502::/home/lamp:/bin/bash
我手工添加了 lamp 用户,它的登录 Shell 是 /bin/bash
,那么这个用户就可以使用普通用户的所有权限。如果我把 lamp 用户的 Shell 修改为 /sbin/nologin
,例如:
[root@localhost ~]# vi /etc/passwd
lamp:x:502:502::/home/lamp:/sbin/nologin
那么这个用户就不能登录了,因为 /sbin/nologin
就是禁止登录的 Shell。这样说明白了吗?如果我在这里放入的是一个系统命令,如 /usr/bin/passwd
,例如:
[root@localhost ~]# vi /etc/passwd
Lamp:x:502:502::/home/lamp:/usr/bin/passwd
那么这个用户可以登录,但是登录之后就只能修改自己的密码了。但是在这里不能随便写入和登录没有关系的命令,如 ls
,否则系统不会识别这些命令,也就意味着这个用户不能登录。
/etc/shadow
影子文件 这个文件中保存着用户的实际加密密码和密码有效期等参数。我们已经知道这个文件的权限是 000,所以保存的实际加密密码除 root 用户外,其他用户是不能查看的,这样做有效地保证了密码的安全。如果这个文件的权限发生了改变,则需要注意是否是恶意攻击。我们打开这个文件看看,例如:
[root@localhost ~] vi /etc/shadow root:$6$m2MwR08L48jY6YN5$lmq0B9ruMxCUesmDvDs2vFDAG0adTlbfgWHAxlwxEa8388/yyC2WY/p9tMQSrfrjxNOsSnOIjRlGHxuYNkeJI1:18642:0:99999:7:::
bin:*:18353:0:99999:7:::
daemon:*:18353:0:99999:7:::
...省略部分输出...
这个文件的每行代表一个用户,同样使用“:”作为分隔符,划分为 9 个字段。我们以 root 行为例,这 9 个字段的作用如下。
- 用户名称
第一个字段中保存的是用户名称,和 /etc/passwd
文件的用户名称相对应。
- 密码
第二个字段中保存的是真正加密的密码。目前 Linux 的密码采用的是 SHA512 散列加密算法,而原来采用的是 MDS 或 DES 加密算法。SHASI2 散列加密算法的加密等级更高,也更加安全。注意:这串密码产生的乱码不能手工修改,如果手工修改,就会算不出原密码,导致密码失效。当然,我们也可以在密码前人为地加入“1”或“*”改变加密值让密码暂时失效,使这个用户无法登录,达到暂时禁止用户登录的效果。
注意
所有伪用户的密码都是“!!”或“*”,代表这些用户都没有密码,是不能登录的。当然,新创建的用户如果不设定密码,那么它的密码项也是“!!”,代表这个用户没有密码,不能登录。
- 密码最后一次修改日期
第三个字段是密码的修改日期,可是这里怎么是 18768 啊?代表什么意思呢?其实 Linux 更加习惯使用时间戳代表时间,也就是说,以 1970 年 1 月 1 日 作为标准时间,每过去一天,时间戳加 1,那么 366 代表的就是 1971 年1 月 1 日。我们这里的时间戳是 18768,也就是说,是在 1970 年1 月 1 日之后的第 15775 天修改的 root 用户密码。好隐晦的表示啊!那么,到底 18768 的时间戳代表的是哪一天呢?我们可以使用如下命令进行换算:
[root@localhost ~]# date -d "1970-01-01 18768 days"
2013年 05月 21日 星期五 00:00:00 EDT
用以上命令可以把时间戳换算为我们习惯的系统日期,那么我们可以把系统日期换算为时间戳吗?当然可以,命令如下:
[root@localhost ~]# echo $(($(date --date="2013/05/20" +%s)/86400+1))
18768
这里的 2013/05/20 是你要计算的日期,+%s 是把当前日期换算成自 1970 年 1 月 1 日以来的总秒数,除以 86400(每天的秒数),最后加上 1 补齐 1970 年 1 月 1 日 当天就能计算出时间戳了。其实不需要理解这里的命令,只要知道时间戳的概念就好,如果需要换算就套用命令。
- 密码的两次修改间隔时间
第四个字段是密码的两次修改间隔时间。这个字段要和第三个字段相比,也就是说密码被修改后多久不能再修改密码。如果是 0,则密码可以随时修改。如果是 10,则代表密码修改后10 天之内不能再次修改这个密码。
- 密码的有效期
第五个字段是密码的有效期。这个字段也要和第三个字段相比,也就是说密码被修改后可以生效多少天。默认值是 99999,也就是 273 年,大家可以认为永久生效。如果改为 90,那么密码被修改 90 天之后就必须再次修改,否则该用户就不能登录了。我们在管理服务器的时候可以通过这个字段强制用户定期修改密码。
- 密码修改到期前的警告天数
第六个字段是密码修改到期前的警告天数。这个字段要和第五个字段相比,就是密码到期前需提前几天修改。默认值是 7,也就是说从密码到期前的7 天开始,每次登录系统都会警告该用户修改密码。
- 密码过期后的宽限天数
第七个字段是密码过期后的宽限天数。这个字段要和第五个字段相比,也就是密码过期后,用户如果还是没有修改密码,那么在宽限天数内用户还是可以登录系统的;如果过了宽限天数,那么用户就无法再使用该器码登录了。天数如果是 10,则代表密码过期 10 天后失效;如果是 0,则代表密码过期后立叫失效;如果是 -1,则代表密码永远不会失效。
- 账号失效时间
第八个字段是用户的账号失效时间。这里同样要写时间戳,也就是用 1970 年1 月 1日 进行时间换算。如果超过了失效时间,就算密码没有过期,用户也就失效,无法使用了。
- 保留
这个字段目前没有使用。
小提示
在 Linux 中,如果遗忘了密码,则可以启动进入单用户模式。这时既可以删除 /etc/passwd
文件中的密码标识字段,也可以删除 /etc/shadow
文件中的密码标识字段,都可以达到清空密码的目的。
/etc/group
组信息文件 这个文件是记录 组ID(GID)和组名的对应文件。/etc/passwd
文件的第四个字段记录的是每个用户的 初始组ID,那么这个 GID 的组名到底是什么呢?就要从 /etc/group
文件中查找。这个文件的内容如下:
[root@localhost ~]# vi /etc/group
root:x:0:
bin:x:1:bin,daemon
daemon:x:2:bin,daemon
...省略部分输出...
lamp:x:502:
我们手工添加的用户 lamp 也会默认生成一个 lamp 用户组,GID 是 502,作为 lamp 用户的初始组。这个文件和上面两个文件一样,用“:”作为分隔符,划分为 4 个字段。我们同样以 root 行作为例子讲解,每个字段的具体含义如下:
- 组名
第一个字段是组名字段,也就是用户组的名称字段。
- 组密码标志
第二个字段是组密码标志字段。和 /etc/passwd
文件一样,这里的“x”仅仅是密码标识,真正的加密之后的组密码保存在 /etc/gshadow
文件中。不过,用户设置密码是为了验证用户的身份,但是用户组设置密码是用来做什么的呢?用户组密码主要是用来指定组管理员的,由于系统中的账号可能会非常多,root 用户可能没有时间进行用户的组调整,这时可以给用户组指定组管理员,如果有用户需要加入或退出某用户组,则可以由该组的组管理员替代 root 进行管理。但是这项功能目前很少使用,我们也很少设置组密码。如果需要赋予某用户调整某个用户组的权限,则可以使用 sudo
命令代替。
- 组ID(GID)
第三个字段是用户组 ID,和 UID 一样,Linux 系统是通过 GID 来区别不同的用户组的,组名只是为了便于管理员识别。所以,在 /etc/group
文件中可以查看对应的组名和 GID。
组中的用户
第四个字段表示的就是这个用户组中到底包含了哪些用户。需要注意的是,如果该用户组是这个用户的初始组,则该用户不会写入这个字段。也就是说,写入这个字段的用户是这个用户组的附加用户。比如 lamp 组就是这样写的
lamp:x:502:
,并没有在第四个字段中写入 lamp 用户,因为 lamp 组是 lamp 用户的初始组。如果要查询这些用户的初始组,则需要先到/etc/passwd
文件中查看 GID(第四个字段),然后到/etc/group
文件中比对组名。
每个用户都可以加入多个附加组,但是只能属于一个初始组。所以我们在实际工作中,如果需要把用户加入其他组,则需要添加附加组。一般情况下,用户的初始组就是在建立用户的同时建立的和用户名相同的组。
注意
我们讲了三个用户配置文件 /etc/passwd
、/etc/shadow
、/etc/group
,它们之间的关系是这样的——先在 /etc/group
文件中查询用户组的 GID 和组名;然后在 /etc/passwd
文件中查找该 GID 是哪个用户的初始组,同时提取这个用户的用户名和 UID;最后通过 UID 到 /etc/shadow
文件中提取和这个用户相匹配的密码。
/etc/gshadow
组密码文件 这个文件就是保存组密码的文件。如果我们给用户组设定了组管理员,并给该用户组设定了组密码,那么组密码就保存在这个文件中,组管理员就可以利用这个密码管理这个用户组了,该文件的内容如下:
[root@localhost ~]# vi /etc/gshadow
root:::
bin:::bin,daemon
daemon:::bin,daemon
...省略部分输出...
lamp:!::
这个文件同样使用“:”作为分隔符,把文件划分为 4 个字段,每个字段的含义如下。
- 组名
第一个字段是这个用户的组名。
- 组密码
第二个字段就是实际加密的组密码。大家已经注意到,对于大多数用户来说,这个字段不是空就是“!”,代表这个组没有合法的组密码。
- 组管理员用户名
第三个字段表示这个组的管理员是哪个用户。
- 组中的附加用户
第四个字段用于显示这个用户组中有哪些附加用户。
用户管理相关文件
上面介绍的 4 个文件是用户的配置文件,每个用户的信息、权限和密码都保存在这 4 个文件中。下面要介绍的几个文件虽然不是用户的配置文件,但也是在创建用户时所自动建立或者和用户创建相关的文件。
- 用户的家目录
每个用户在登录 Linux 系统时,必须有一个默认的登录位置,该用户对这个目录应该拥有一定的权限,我们把这个目录称作用户的家目录。普通用户的家目录位于 /home/
下,目录名和用户名相同。例如,lamp 用户的家目录就是 /home/lamp/
,这个目录的权限如下:
[root@localhost ~]# ll -d /home/lamp/
drwx------ 3 lamp 1amp 4096 1月 4 05:40 /home/lamp/
目录的属主是 lamp 用户,属组是 lamp 用户组,权限是 700,lamp 用户对 /home/lampl
家目录拥有读、写和执行权限。
超级用户的家目录位于 /
下。例如,超级用户的家目录就是 /root/
,这个目录的权限如下:
[root@localhost ~]# ll -d /root/
dr-xr-x--- 6 root root 4096 12月 29 00:17 /root/
在 Linux 中,家目录用“~”表示,当前命令的提示符是“[root@localhost ~]#”,表示当前所在目录就是家目录。而我当前是超级用户,所以我的家目录就是 /root/
。
- 用户邮箱目录
在建立每个用户的时候,系统会默认给每个用户建立一个邮箱。这个邮箱在 /var/spool/mail
目录中,如 lamp 用户的邮箱就是 /var/spool/mail/lamp
。
- 用户模板目录
刚刚我们说了每个用户都有一个家目录,比如 lamp 用户的家目录就是 /home/lamp/
,我们进入这个目录,看看里面有什么内容。
[root@localhost ~]# cd /home/lamp/
[root@localhost lamp]# ls
[root@localhost lamp]#
这个用户因为是新建立的,所以家目录中没有保存任何文件,是空的。但真的是空的吗?有没有隐藏文件呢?我们再来看看。
[root@localhost lamp]# ls -a
. .. .bash_Logout .bash_profile .bashrc .gnome2
原来这个目录中还是有文件的,只不过这些文件都是隐藏文件。那么这些文件都是做什么的?是从哪里来的呢?这些文件都是当前用户 lamp 的环境变量配置文件,这里保存的都是该用户的环境变量参数。那么,什么是环境变量配置文件呢?我们这么说吧,在 Windows 中虽然只有一台计算机,但是如果使用不同的用户登录,那么每个用户的操作环境(如桌面背景、分辨率、桌面图标)都是不同的。因为每个用户的操作习惯不同,所以 Windows 运行用户自行定义的操作环境。在 Linux 中可以吗?当然可以,只不过 Windows 是通过更直观的图形界面来进行设置和调整的,而 Linux 是通过文件来进行调整的。我们将这些根据用户习惯调整操作系统环境的配置文件称作环境变量配置文件。/home/lamp/
目录中的这些环境变量配置文件所定义的操作环境只对 lamp 用户生效,其他每个用户的家目录中都有相应的环境变量配置文件。
那么,这些环境变量配置文件都是从哪里来的呢?其实有一个模板目录,这个模板目录就是 /etc/skel/
目录,每创建一个用户,系统会自动创建一个用户家目录,同时把模板目录 /etc/skel/
中的内容复制到用户家目录中。我们看看 /etc/skel/
目录中有一些什么内容。
[root@localhost ~]# cd /etc/skel/
[root@localhost skel]# ls -a
. .. .bash_logout .bash_profile .bashrc gnome2
是不是和 /home/lamp/
目录中的内容一致呢?我们做一个实验,在 /etc/skel/
目录中随意创建一个文件,我们看看新建立的用户的家目录中是否也会把这个文件复制过来。
[root@localhost ~]# cd /etc/skel/
#进入模板目录
[root@localhost skel]# touch test
创建一个临时文件 test
[root@localhost skel]# ls -a
. .. .bash_logout .bash_profile .bashrc gnome2 test
#查看文件,除环境变量配置文件之外,多了一个 test 文件
[root@localhost skel]# useradd userl
#添加用 userl
[root@localhost skel] cd /home/user1
#进入 user1 的家目录
[root@localhost userl]# ls -a
. .. .bash_logout .bash_profile .bashrc gnome2 test
#看到了吗?系统自动建立的家目录中是不是也多出了 test 文件
这样大家就明白模板目录的作用了吧。如果需要让每个用户的家目录中都有某个目录或文件,就可以修改模板目录。
总结
Linux 系统中和用户相关的文件主要有 7 个。其中 4 个是用户配置文件,分别是 /etc/passwd
、/etc/shadow
、/etc/group
、/etc/gshadow
。这几个文件主要定义了用户的相关参数,我们可以通过手工修改这几个文件来建立或修改用户的相关信息,当然也可以通过命令修改。还有 3 个文件是用户管理相关文件,分别是用户的家目录、用户邮箱目录、用户模板目录,这些目录在建立用户的时候都会起到相应的作用,一般不需要修改。
用户管理命令
前面我们讲了用户相关文件,如果要添加或删除用户,则通过手工修改配置文件的方法也是可以的。但是这样做太麻烦了,Linux 系统为我们准备了完善的用户管理命令,我们现在就来学习一下这些命令吧。
添加用户:useradd
- 命令格式
添加用户的命令是 useradd
,命令格式如下:
useradd [选项] 用户名
选项:
-u UID :手工指定用户的 UID,注意手工添加的用户的 UID 不要小于 500
-d 家目录 :手工指定用户的家目录。家目录必须写绝对路径,而且如果需要手工指定家目录,则一定要注意权限
-c 用户说明 :手工指定用户说明。还记得 /etc/passwd 文件的第五个字段吗?这里就是指定该字段内容的
-g 组名 :手工指定用户的初始组。一般以和用户名相同的组作为用户的初始组,在创建用户时会默认建立初始组。如果不想使用默认初始组,则可以用 -g 手工指定。不建议手工修改
-G 组名 :指定用户的附加组。我们把用户加入其他组,一般都使用附加组
-s shell :手工指定用户的登录 Shell。默认是/bin/bash
-e 日期 :指定用户的失效日期,格式为“YYYY-MM-DD”。也就是/etc/shadow 文件的第八个字段
-o :允许创建的用户的 UID 相同。例如,执行“inoraad -u 0 -o usertest”命令建立用户 usertest。它的 UID 和 root 用户的 UID 相同,都是 0
-m :建立用户时强制建立用户的家目录。在建立系统用户时,该选项是默认的
- 添加默认用户
如果我们只是创建用户,则可以不使用任何选项,系统会按照默认值帮我们指定这些选项。只需要最简单的命令就可以了。命令如下:
# 例子1:添加默认用戶
[root@localhost ~]# useradd lamp
那么,这条命令到底做了什么呢?我们依次来看看。
1)在 /etc/passwd
文件中按照文件格式添加 lamp 用户的行。
[root@localhost ~]# grep "lamp" /ete/passwd
lamp:x:500:500::/home/lamp:/bin/bash
注意
用户的 UID 是从 500 开始计算的。同时默认指定了用户的家目录为 /home/lamp/
,用户的登录 Shell 为 /bin/bash
。
2)在 /etc/shadow
文件中建立用户 lamp 的相关行。
[root@localhost ~]# grep "lamp" /etc/shadow
lamp:!!:15710:0:99999:7:::
当然,这个用户还没有设置密码,所以密码字段是“!!”,代表这个用户没有合理密码,不能正常登录。同时会按照默认值设定时间字段。
3)在 /etc/group
文件中建立和用户 lamp 相关的行。
[root@localhost ~] grep "lamp" /etc/group
lamp:x:500:
因为 lamp 组是 lamp 用户的初始组,所以 lamp 用户名不会写入第四个字段。
4)在 /etc/gshadow
文件中建立和用户 lamp 相关的行。
[root@localhost ~]# grep "lamp" /etc/gshadow
lamp:!::
当然,我们没有设定组密码,所以这里没有密码,也没有组管理员。
5)默认建立用户的家目录和邮箱。
[root@localhost ~]# ll -d /home/lamp/
drwx------ 3 lamp Lamp 4096 1月 6 00:19 /home/lamp/
[root@localhost ~]# ll /var/spool/mail/lamp
-rw-rw---- 1 lamp mail 0 1月 6 00:19 /var/spool/mail/lamp
注意这两个文件的权限,都要让 lamp 用户拥有相应的权限。
大家看到了吗?useradd
命令在添加用户的时候,其实就是修改了我们在前面介绍的 7个文件或目录,那么我们可以通过手工修改这些文件来添加或删除用户吗?当然可以了,我们在后面会演示如何通过手工修改文件来删除用户。那什么时候需要手工建立用户?什么时候需要用命令建立用户?其实在任何情况下都不需要手工修改文件来建立用户,我们用命令来建立用户既简便又快捷。我们在这里只是为了说明 Linux 中的所有内容都是保存在文件中的。
- 手工指定选项添加用户
刚刚我们在添加用户的时候全部采用的是默认值,那么我们使用选项来添加用户会有什么样的效果?
# 例子2:手工指定选项添加用户
[root@localhost ~]# groupadd lamp1
#先手工添加 lamp1 用户组,因为我一会儿要把 lamp1 用户的初始组指定过来,如果不事先建立,则会报告用户组不存在
[root@localhost ~]# useradd -u 550 -g lamp1 -G root -d /home/lamp1 -c "test user" -s /bin/bash lamp1
#在建立用户 lamp1 的同时指定了 UID(550)、初始组(lamp1)、附加组(root)、家目录(/home/lamp1/)、用户说明(test user)和用户登录Shell(/bin/bash)
[root@localhost ~]# grep "lamp1" /etc/passwd /etc/shadow /etc/group
#同时查看三个文件
/etc/passwd:lamp1:x:550:502:test user:/home/lamp1:/bin/bash
#用户的 UID、初始组、用户说明、家目景和登录 She11 都和命令手工指定的一致
/etc/shadow:lamp1:!!:15710:0:99999:7:::
#lamp1 用户还没有设定密码
/etc/group:root:x:0:lamp1
#lamp1 用户加入了 root 组,root 组是 lamp1 用户的附加组
/etc/group:lamp1:x:502:
#GID 为 502 的组是 lamp1 组
(Vetc/group:1amp1:x:502:4
[root@localhost ~]# ll -d /home/lamp1/
drwx------ 3 lamp1 lamp1 4096 1月 6 01:13 /home/lamp1/
#家目录也建立了,不需要手工建立
例子有点复杂,其实如果可以看懂还是很简单的,就是添加了用户,但是不再使用用户的默认值,而是手工指定了用户的 UID (是 550,而不再是 501)、初始组、附加组、家目录、用户说明和用户登录 Shell。这里还要注意一点,虽然手工指定了用户的家目录,但是家目录不需要手工建立,在添加用户的同时会自动建立家目录。如果手工建立了家目录,那么一定要修改目录的权限和从 /etc/skel/
模板目录中复制环境变量文件,反而更加麻烦。
- useradd 命令的默认值设定
大家发现了吗?在添加用户时,其实不需要手工指定任何内容,都可以使用 useradd
命令默认创建,这些默认值已经可以满足我们的要求。但是 useradd
命令的这些默认值是保存在哪里的呢?能否手工修改呢?
useradd
命令在添加用户时参考的默认值文件主要有两个,分别是 /etc/default/useradd
和 /etc/login.defs
。我们先看看 /etc/default//useradd
文件的内容。
[root@localhost ~]# vi /etc/default/useradd
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
/etc/default//useradd
的默认值解释如表13-1:
表13-1 useradd 命令的默认值
默认值 | 解释说明 |
---|---|
GROUP=100 | 用于建立用户的默认组。 在添加每个用户时,用户的初始组就是 GID 为 100 的这个用户组 |
HOME=/home | 用户的家目录的默认位置。 所有新建用户的家目录默认都在 /home/ 下 |
INACTIVE=-1 | 密码过期后的宽限天数。也就是 /etc/shadow 文件的第七个字段,-1:代表所有新建立的用户密码永远不会失效 |
EXPIRE= | 密码失效时间。也就是/etc/shadow 文件的第八个字段, 默认值是空,代表所有新建用户没有失效时间,永久有效 |
SHELL=/bin/bash | 用户的默认 Shell。/bin/bash 是 Linux 的标准 Shell,代表所有新建立的用户默认 Shell 都是 /bin/bash |
SKEL=/etc/skel | 定义用户的模板目录的位置。/etc/skel/ 目录中的文件都会复制到新建用户的家目录中 |
CREATE_MAIL_SPOOL=yes | 是否给新建用户建立邮箱。默认是创建, 新建用户,系统会新建一个和用户名相同邮箱,在 /var/spool/mail/ 目录下 |
当然,这个文件也可以直接通过命令进行查看,结果是一样的(和 /etc/default/useradd
内容一样)。命令如下:
[root@localhost ~]# useradd -D
选项:
-D :查看新建用户的默认值
通过 /etc/default/useradd
文件大家已经能够看到我们新建用户的部分默认值,但是还有一些内容并没有在这个文件中出现,比如用户的 UID 为什么默认从 500 开始计算,/etc/shadow
文件中除第一、二、三个字段不用设定默认值外,还有第四、五、六个字段没有指定默认值(第七、八个字段的默认值在 /etc/default/useradd
文件中指定了)。那么,这些默认值就需要第二个默认值文件 /etc/login.defs
了,这个文件的内容如下:
[root@localhost ~]# vi /etc/login.defs
#这个文件有一些注释,把注释删除,文件内容就变成下面这个样子了
MAIL_DIR /var/spool/mail
PASS_MAX_DAYS 99999
PASS_MIN_DAYS 0
PASS_MIN_LEN 5
PASS_WARN_AGE 7
UID_MIN 500
UID_MAX 60000
GID_MIN 500
GID_MAX 60000
CREATE_HOME yes
UMASK 077
USERGROUPS_ENAB yes
ENCRYPT_METHOD SHA512
/etc/login.defs
的默认值解释如下表:
表13-2 /etc/login.defs 的默认值
默认值 | 解释说明 |
---|---|
MAIL_DIR | 指定了新建用户的默认邮箱位置。默认在/var/spool/mail/ 目录下 |
PASS_MAX_DAYS | 指定的是密码的有效期。也就是 /etc/shadow 文件的第五个字段,代表多少天之后必须修改密码 |
PASS_MIN_DAYS | 指定的是密码的两次修改间隔时间。也就是 /etc/shadow 文件的第四个字段,代表上次修改密码后,几天后才能再次修改密码 |
PASS_MIN_LEN | 密码的最小长度。默认不小于 5 位。 但是现在用户登录时验证已经被 PAM 模块取代,所以这个选项并不生效 |
PASS_WARN_AGE | 密码修改到期前的警告天数。也就是 /etc/shadow 文件的第六个字段。代表密码到达有效期前多少天开始进行警告提醒 |
UID_MIN UID_MAX | 指定了创建用户时最小 UID 和最大 UID 的范围 |
GID_MIN GID_MAX | 指定了 GID 的最小值和最大值的范围 |
CREATE_HOME | 指定建立用户时是否自动建立用户的家目录,默认是建立 |
UMASK | 指定建立的用户家目录的默认权限, 因为 umask 值是 077,所以新建的用户家目录的权限是 700 |
USERGROUPS_ENAB | 指定使用命令 userdel 删除用户时,是否删除用户的初始组,默认是删除 |
ENCRYPT_METHOD | 指定 Linux 用户的密码使用 SHA512 散列模式加密。 |
我们现在已经知道了,系统在默认添加用户时,是靠 /etc/default/useradd
和 /etc/login.defs
文件定义用户的默认值的。如果我们想要修改所有新建用户的某个默认值,就可以直接修改这两个文件,而不用每个用户单独修改了。
修改用户密码:passwd
- 命令格式
我们在上一小节中介绍了添加用户的命令,但是新添加的用户如果不设定密码是不能够登录系统的,那么我们来学习一下密码设置命令 passwd
。
paaswd [选項] 用户名
选项:
-S :查询用户密码的状态,也就是 /etc/shadow 文件中的内容。仅 root 用户可用
-l :暂时锁定用户。仅 root 用户可用
-u :解锁用户。仅 root 用户可用
--stdin :可以将通过管道符输出的数据作为用户的密码。主要在批量添加用户时使用
[rootelocalhost ~]# passwd
#passwd 直接回车代表修改当前用戶的密码
- root 用户修改密码
下面举几个例子,我们给新用户 lamp 设定密码,让 lamp 用户可以登录系统。
# 例子1:
[root@localhost ~]# pasawd lamp
更改用户 1amp 的密码。
新的 密码: <---输入新的密码
无效的密码: 密码少于 8 个字符 <---有报错提示
无效的密码: 密码未通过字典检查 - 它基于字典单词
重新输入新的 密码: <---第二次输入宿码
passwd:所有的身份验证令牌已经成功更新。
注意,要想给其他用户设定密码,只有两种用户可行:一种是 root 用户:另一种是 root 通过 sudo 命令赋予权限的普通用户。也就是说,普通用户只能修改自己的密码,而不能设定其他用户的密码。
还要注意一件事,设定用户密码时一定要遵守“复杂性、易记性、时效性”的密码规范。简单来讲就是密码要大于 8 位,包含大写字母、小写字母、数字和特殊符号中的 3 种,并且容易记忆和定期更换。但是 root 用户在设定密码时却可以不遵守这些规则,比如我刚刚给 lamp 用户设定的密码是“123”,系统虽然会提示密码过短和过于简单,但是依然可以设置成功。不过普通用户在修改自己的密码时,一定要遵守密码规范。当然,在生产服务器上,就算是 root身份,在设定密码时也要严格遵守密码规范,因为只有好的密码规范才是服务器安全的基础。
- 普通用户修改密码
那么我们看看普通用户 lamp 是如何修改密码的。
# 例子 2:
[lamp@localhost ~]# whoami
lamp
#先看看我的身份
[lamp@localhost ~]$ passwd lamp1
passwd: 只有根用户才能指定用户名称
#尝试修改 lamp1 用户的密码,系统提示普通用户不能修改其他用户的密码
[lamp@localhost ~]$ passwd lamp
passwd: 只有根用户才能指定用户名称。
#怎么修改自己的密码也报错呢?这里其实说得很情楚,要想指定用户名修改密码,只有管理员可以,哪怕是修改自己的密码。那么修改自己的密码就只能像下面这样了
[lamp@localhost ~]$ passwd
#使用 passwd 直接回车,就是修改自己的密码
更改用户 lamp 的密码。
为 lamp 更改 STRESS 密码。
(当前)UNTX 密码: <---注意,普通用户需要先输入自己的密码
新的密码:
无效的密码:密码未通过字典检查 - 它基于字典单词 <---好吧,又报错了,因为我输入的密码在字典中能够找到
新的密码: <---密码必須符合密码规范重新输入新的密码:
passwd:所有的身份验证令牌已经成功更新。
大家发现了吗?对普通用户来讲,密码设定就要严格得多了。首先,只能使用 passwd
来修改自己的密码,而不能使用 passwd 用户名
的方式。不过,如果你是 root 用户,则建议用 passwd 用户名
的方式来修改密码,因为这样不容易搞混。其次,在修改密码之前,需要先输入旧密码。最后,设定密码一定要严格遵守密码规范。
- 查看用户密码状态
# 例子 3:
[root@localhost ~]# passwd -S lamp
lamp PS 2013-01-06 0 99999 7 -1 (密码已设置,使用 SHA512 加密。)
#上面这行代码的意思是:
#用户名密码设定时间(2013-01-06) 密码修改间隔时间(0) 密码有效期(99999) 警告时间(7) 密码不失效(-1)
“-S”选项会显示出密码状态,这里的密码修改间隔时间、密码有效期、警告时间、密码宽限时间,其实分别是 /etc/shadow
文件的第四、五、六、七个字段的内容。当然,passwd
命令是可以通过命令选项修改这几个字段的值的,不过我个人认为还是直接修改 /etc/shadow
文件简单一些。再次提醒一下,CentOS 6.3 的加密方式已经从 MD5 加密更新到 SHA512 加密,我们不用了解具体的加密算法,只要知道这种加密算法更加可靠和先进就足够了。
- 锁定和解锁用户使用
使用 passwd
命令可以很方便地锁定和解索某个用户,我们来试试。
# 例子 4:
[root@localhost ~]# passwd -l lamp
锁定用户 lamp 的密码。
passwd:操作成功
#锁定用户
[root@localhost ~]# passwd -S lamp
lamp PS 2013-01-06 0 99999 7 -1(密码已被锁定)
#用“-S”选项查看状态,很清楚地提示密码已被锁定
[root@localhost ~]# grep "lamp" /etc/shadow
lamp:!!$6$ZTq7o/96$1jO7120bzW.D1zBa9CsY43d04onskUczjwiFMNt8px4GxJoHx9zA1SC9.iYzh9LZAAfEM21g92hM9w/p6NS50.:15711:0:99999:7:::
#其实锁定就是在加密密码之前加入了“!!”,让密码失效而已
[root@localhost ~]# passwd -u lamp
解锁用户 lamp 的密码。
passwd:操作成功
#解信用户
[root@localhost ~]# passwd -S lamp
lamp PS 2013-01-06 0 99999 7 -1(密码已设置,使用 SHA512 加密。)
#锁定状态消失
[root@localhost ~]# grep "lamp" /etc/shadow
lamp:$6$ZTq7o/96$1jO7120bzW.D1zBa9CsY43d04onskUczjwiFMNt8px4GxJoHx9zA1SC9.iYzh9LZAAfEM21g92hM9w/p6NS50.:15711:0:99999:7:::
#密码前面的“!!”删除了
- 使用字符串作为用户的密码
这种做法主要是在批量添加用户时,给所有的用户设定一个初始密码。但是需要注意的是,这样设定的密码会把密码明文保存在历史命令中,会有安全隐患。所以,如果使用了这种方式修改密码,那么应该记住两件事情:第一,手工清除历史命令;第二,强制这些新添加的用户在第一次登录时必须修改密码(具体方法参考 chage
命令)。
# 例子 5:
[root@localhost ~]# echo "123" | passwd --stdin lamp
更改用户 lamp 的密码。
passwd:所有的身份验证令牌已经成功更新。
命令很简单,调用管道符,让 echo
的输出作为 passwd
命令的输入,就可以把 lamp 用户的密码设定为“123”了。
修改用户信息:usermod
在添加了用户之后,如果不小心添加错了用户的信息,那么是否可以修改呢?当然可以了,我们可以直控使用编辑器修改用户相关文件,也可以使用 usermod
命令进行修改。我们就来学习下 usermod
命令。该命令的格式如下:
[root@localhost ~]# usermod [选项] 用户
选项:
-u UID :修改用户的 UID
-d 家目录 :修改用户的家目录。家目录必须写绝对路径
-c 用户说明 :修改用户的说明信息,就是 /etc/passwd 文件的第五个字段
-g 组名 :修改用户的初始组,就是 /etc/passwd 文件的第四个字段
-G 组名 :修改用户的附加组,其实就是把用户加入其他用户组
-s shell :修改用户的登录 Shell。默认是 /bin/bash
-e 日期 :修改用户的失效日期,格式为“YYYY-MM-DD”。也就是 /etc/shadow 文件的第八个字段
-L :临时锁定用户(Lock)
-U :解锁用户(Unlock)
可以看到,usermod
和 useradd
命令的选项非常类似,因为它们都是用于定义用户信息的。不过需要注意的是,useradd
命令用于在添加新用户时指定用户信息,而 usermod
命令用于修改已经存在的用户的用户信息,千万不要搞混。
usermod
命令多出了几个选项,其中,-L 可以临时锁定用户,不让这个用户登录。其实锁定的方法就是在 /etc/shadow
文件的密码字段前加入“!”。大家已经知道密码项是加密换算的,所以加入任何字符都会导致密码失效,所以这个用户就会被禁止登录。而解锁(-U)其实就是把密码字段前的“!”取消。举个例子:
# 例子 1:
[root@localhost ~]# usermod -L lamp
#锁定用户
[root@localhost ~]# grep "lamp” /etc/shadow
lamp:!$6SYrPjBgowschRvAsybEncu24hkYFqxREH3NnzhAVDJSQLwRwTSbcA2N8UbPD9bBKvoskyxIaMGs/Eg5AQwO.UokonKqaHFa/:15711:0:99999:7:::
#查看发现锁定就是在密码宇段前加入“!”,这时 lamp 用户就暂时不能登录了
[root@localhost ~]# usermod -U lamp
#解锁用户
[root@localhost ~]# grep "lamp" /etc/shadow
lamp:$6SYrPjBgowschRvAsybEncu24hkYFqxREH3NnzhAVDJSQLwRwTSbcA2N8UbPD9bBKvoskyxIaMGs/Eg5AQwO.UokonKqaHFa/:15711:0:99999:7:::
#取消了密码字段前的“!”
再举几个其他的例子:
# 例子 2:
[root@localhost ~]# usermod -G root lamp
#把 lamp 用户加入 root 组
[root@localhost ~]# grep "lamp" /etc/group
root:x:0:lamp
lamp:x:501:
#lamp 用户已经加入了 root 组
# 例子 3:
[root@localhost ~]# usermod -c "test user" lamp
#修改用户说明
[root@localhost ~]# grep "lamp" /etc/passwd
lamp:x:501:501:test user:/home/lamp:/bin/bash
#查看一下,用户说明已经被修改了
修改用户密码状态:chage
通过 chage
命令可以查看和修改 /etc/shadow
文件的第三个字段到第八个字段的密码状态。我个人建议直接修改 /etc/shadow
文件更加直观和简单,那么为什么还要讲解 chage
命令呢?因为 chage
命令有一种很好的用法,就是强制用户在第一次登录时必须修改密码。chage
命令的格式如下:
[root@localhost ~]# chage [选项] 用户名
选项:
-l :列出用户的详细密码状态
-d 日期 :密码最后一次修改日期( /etc/shadow 文件的第三个字段)。格式为 YYYY-MM-DD
-m 天数 :密码的两次修改间隔时间(第四个字段)
-M 天数 :密码的有效期(第五个字段)
-W 天数 :密码修改到期前的警告天数(第六个字段)
-I 天数 :密码过期后的宽限天数(第七个字段)
-E 日期 :账号失效时间(第八个字段),格式为 YYYY-MM-DD
举几个例子,先看看查看状态。
# 例子 1:
[root@localhost ~]# chage -l lamp
#查看一下用户密码状态
Last password change : Jan 06, 2013
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
我们强制 lamp 用户在第一次登录时必须修改密码。
# 例子 2:
[root@localhost ~]# chage -d O lamp
#这个命令其实是把密码修改日期归零了,这样用户一登录就要修改密码
然后我们以 lamp 用户登录一下系统。
localhost login: lamp
Password:
#输入密码登录
You are required to change your password immediately (root enforced)
changing password for lamp.
#有一些提示,就是说明 root 强制你登录后修改密码
(current) UNIX password:
#输入旧密码
New password:
Retype new password:
#输入两次新密码
这项功能在进行批量用户管理时还是非常有用的。
删除用户:userdel
这个命令比较简单,就是删除用户。命令格式如下:
[root@localhost ~] userdel [-r] 用户名
选项:
-r :在删除用户的同时删除用户的家目录
# 例如:
[root@localhost ~]# userdel -r lamp
在删除用户的同时如果不删除用户的家目录,那么家目录就会变成没有属主和属组的目录,也就是垃圾文件。
前面我们说过,可以手工修改用户的相关文件来建立用户,但在实际工作中,这样做没有实际的意义,因为用户管理命令可以更简单地完成这项工作。在学习时,手工添加用户是有助于加深我们对用户相关文件的理解的。不过手工添加用户还是比较麻烦的,我们变通一下,手工删除用户,原理是一样的,能够手工删除当然也可以手工建立。
# 例如:
[root@localhost ~]# useradd lamp
[root@localhost ~]# passwd lamp
#重新建立 lamp 用户
[root@localhost ~]# vi /etc/passwd
lamp:x:501:501::/home/lamp:/bin/bash <---删除此行
#修改用户信息文件,删除 lamp 用户行
[root@localhost ~]# vi /etc/shadow
lamp:$6$KooYtcQJ$56Xk9vp3D2vMRBxibNon,21cVJ9onbW81Hx4WrOx6qBqfGa9u3mjMsGjqYnjL/4t3zt3YxElce2X8rbb12x4a0:15716:0:99999:7::: <---删除此行
#修改影子文件,删除 lamp 用户行。注意:这个文件的权限是 000,所以要强制保存
[root@localhost ~]# vi /etc/group
lamp;x:501: <---删除此行
#修改组信息文件,删除 lamp 组的行
[root@localhost ~]# vi /etc/gshadow
lamp:!:: <---删除此行
#修改组影子文件,删除 lamp 组的行。同样注意需要强制保存
[root@localhost ~]# rm -rf /var/spool/mail/lamp
#删除用户邮箱
[root@localhost ~]# rm -rf /home/lamp/
#删除用户的家目录
#至此,用户彻底删除,再新建用户lamp。如果可以正常建立,则说明我们手工删除干净了
[root@localhost ~]# useradd lamp
[root@localhost ~]# passwd lamp
#重新建立同名用户,没有报错,说明前面的手工删除是可以完全删除用户的
这个实验很有趣吧,不过命令比较多,大家通过这个实验应该可以清楚地了解到这几个用户相关文件的作用。
查看用户的 UID 和 GID:id
id
命令可以查询用户的 UID、GID 和附加组的信息。命令比较简单,格式如下:
[root@localhost ~]# id 用户名
# 例子 1:
[root@localhost ~]# id lamp
uid=501(lamp) gid=501(lamp) groups=501(lamp)
#能看到 uid(用户ID)、gid(初始组ID)、groups 是用户所在组,这里既可以看到初始组,如果有附加组,则也能看到附加组
# 例子 2:
[root@localhost ~]# usermod -G root lamp
#把用户加入 root 组
[root@localnost ~]# id lamp
uid=501(lamp) gid=501(lamp) groups=501(lamp),0(root)
#大家发现 root 组中加入了 lamp 用户的附加组信息
切换用户身份:su
su
命令可以切换成不同的用户身份,命令格式如下:
[root@localhost ~]# su [选项] 用户名
选项:
- :选项只使用“-”代表连带用户的环境变量一起切换
-c 命令 :仅执行一次命令,而不切换用户身份
“-”不能省略,它代表切换用户身份时,用户的环境变量也要切换成新用户的环境变量。大家知道环境变量是用来定义用户的操作环境的,如果环境变量没有随用户身份切换,那么很多操作将无法正确执行。比如普通用户 lamp 切换成超级用户 root,但是没有加入“-”,那么虽然是 root 用户,但是 $PATH
环境变量还是 lamp 用户的,不包含 /sbin
、/usr/sbin
等超级用户命令保存路径,所以无法使用管理员命令;而且 root 用户在接收邮件时,还会发现收到的是 lamp 用户的邮件,因为环境变量 $MAIL
没有切换过来。
# 例子 1:
[lamp@localhost ~]$ whoami
lamp
#查询用户身份,我是lamp
[lamp@localhost ~]$ su root
密码: <---输入 root 密码
#切換到 root,但是没有切换环境变量。注意:普通用户切换到 root 需要密码
[root@localhost ~]# env | grep lamp
#查看环境变量,提取包含 lamp 的行
USER=lamp
#用户名还是 lamp,而不是 root
PATH=/usr/lib/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/lamp/bin
#命令查找的路径不包含超级用户路径
MAIL=/var/spool/mail/lamp
PWD=/home/lamp
LOGNAME=lamp
#邮箱、家目录、目前用户名还是 lamp
通过例子 ! 我们已经注意到,切换用户时如果没有加入“-”,那么切换是不完全的。要想完整切换,可以使用如下命令:
# 例子 2:
[lamp@localhost ~]$ su - root
密码:
#”-”代表连带环境变量一起切換,不能有省略
有些系统命令只有 root 可以执行,比如添加用户的命令 useradd
,所以我们需要使用 root 身份执行。但是我们只想执行一次,而不想切换身份,可以做到吗?当然可以,命令如下:
# 例子 3:
[lamp@localhost ~]$ whoami
lamp
#当前我是 lamp
[lamp@localhout ~]$ su - root -c "uneradd user1"
密码:
#不切換成 root,但是执行 useradd 命今添加 userl 用户
[lamp@localhost ~]$ whoami
lamp
#我还是1amp
[lamp@localhost ~]$ grep "userl" /etc/passwd
user1:x:502:504::/home/user1:/bin/bash
#user1 用户已经添加了
总之,切换用户时“-”代表连带环境变量一起切换,不能省略,否则用户身份切换不完全。
用户组管理命令
添加用户组:groupadd
添加用户组的命令是 groupadd
,命令格式如下:
[root@localhost ~]# groupadd [选项] 组名
选项:
-g GID :指定组ID
添加用户组的命令比较简单,举个例子:
[root@localhost ~]# groupadd groupl
#添加 group1 组
[root@localhost ~]# grep "groupl" /etc/group
group1:x:502:
修改用户组:groupmod
groupmod
命令用于修改用户组的相关信息,命令格式如下:
[root@localhost ~]# groupmod [选项] 组名
选项:
-g GID :修改组ID
-n 新组名 :修改组名
例子:
[root@localhost ~]# groupmod -n testgrp group1
#把组名 group1 修改为 testgrp
[root@localhost ~]# grep "testgrp" /etc/group
testgrp:x:502:
#注意 GID 还是 502,但是组名已经改变
不过大家还是要注意,用户名不要随意修改,组名和 GID 也不要随意修改,因为非常容易导致管理员逻辑混乱。如果非要修改用户名或组名,则建议大家先删除旧的,再建立新的。
删除用户组:groupdel
groupdel
命令用于删除用户组,命令格式如下:
[root@localhost ~]# groupdel 组名
#例子:
[root@localhost ~]# groupdel testgrp
#删除 testgrp 组
不过大家要注意,要删除的组不能是其他用户的初始组,也就是说这个组中没有初始用户才可以删除。如果组中有附加用户,则删除组时不受影响。
把用户添加进组或从组中删除:gpasswd
其实 gpasswd
命令是用来设定组密码并指定组管理员的,不过我们在前面已经说了,组密码和组管理员功能很少使用,而且完全可以被 sudo
命令取代,所以 gpasswd
命令现在主要用于把用户添加进组或从组中删除。命令格式如下:
[root@localhost ~]# gpasswd [选项] 组名
选项:
-a 用户名 :把用户加入组
-d 用户名 :把用户从组中删除
# 例子:
[root@localhost ~]# groupadd grouptest
#添加组 grouptest
[root@localhost ~]# gpasswd -a lamp grouptest
Adding user lamp to group grouptest
#把用户 lamp 加入 grouptest 组
[root@localhost ~]# grep "lamp" /etc/group
lamp:x:501:
grouptest:x:505:lamp
#查看一下,lamp 用户已经作为附加用户加入 grouptest 组
[root@localhost ~]# gpasswd -d lamp grouptest
Removing user lamp from group grouptest
#把用户 lamp 从组中删除
[root@localhost ~]# grep "grouptest" /etc/group
grouptest:x:505:
#组中没有 lamp 用户了
大家注意,也可以使用 usermod
命令把用户加入某个组,不过 usermod
命令的操作对象是用户,命令是 usenmod -G grouptest lamp
,把用户名作为参数放在最后;而 gpasswd
命令的操作对象是组,命令是 gpasswd -a lamp grouptest
,把组名作为参数放在最后。
推荐大家使用 gpasswd
命令,因为这个命令不仅可以把用户加入用户组,也可以把用户从用户组中删除。
改变有效组:newgrp
我们说过,每个用户可以属于一个初始组(用户是这个组的初始用户),也可以属于多个附加组(用户是这个组的附加用户)。既然用户可以属于这么多用户组,那么用户在创建文件后,默认生效的组身份是哪个呢?当然是初始用户组的组身份生效了,因为初始组是用户一旦登录就直接获得的组身份。也就是说,用户在创建文件后,文件的属组是用户的初始组,因为用户的有效组默认是初始组。既然用户属于多个用户组,那么能不能改变用户的有效组呢?使用命令 newgrp
就可以切换用户的有效组。命令格式如下:
[root@localhost ~]# newgrp 组名
举个例子,我们已经有了普通用户 lamp,默认会建立 lamp 用户组,lamp 组是 lamp 用户的初始组。我们再把 lamp 用户加入 group1 组,那么 group1 组就是 lamp 用户的附加组。当 lamp 用户创建文件 test1 时,test1 文件的属组是 lamp 组,因为 lamp 组是 lamp 用户的有效组。通过 newgp
命令就可以把 lamp 用户的有效组变成 group1 组,当 lamp 用户创建文件 test2 时,就会发现 test2 文件的属组就是 group1 组。命令如下:
[root@localhost ~]# groupadd group1
#添加组 group1
[root@localhost ~]# gpasswd -a lamp groupl
Adding user lamp to group groupl
#把 lamp 用户加入 group1 组
[root@localhost ~]# grep "lamp" /ete/group
lamp:x;501:
group1:x:503:lamp
# lamp 用户既属于 lamp 组,也属于 group1 组
[root@localhost ~]# su - lamp
#切換成 lamp 身份,超级用户切换成普通用户不用密码
[lamp@localhost ~]$ touch test1
#创建文件 test1
[lamp@localhost ~]$ ll testl
-rw-rw-r-- 1 lamp lamp 0 1月 14 05:43 test1
# test1 文件的默认属组是 lamp 组
[lamp@localhost ~]$ newgrp groupl
#切换 lamp 用户的有效组为 group1 组
[lamp@localhost ~]$ touch test2
#创建文件 test2
[lamp@localhost ~]$ 11 test2
-rw-r--r-- 1 lamp groupl 0 1月 14 05:44 test2
#test2 文件的默认属组是 group1 组
通过这个例子明白有效组的作用了吗?其实就是当用户属于多个组时,在创建文件是哪个组身份生效。使用 nwegrp
命令可以在多个组身份之间切换。