Linux 是多用户多任务操作系统,换句话说,Linux 系统支持多个用户在同一时间内登陆,不同用户可以执行不同的任务,并且互不影响。
例如,某台 Linux 服务器上有 4 个用户,分别是 root、www、ftp 和 mysql,在同一时间内,root 用户可能在查看系统日志、管理维护系统;www 用户可能在修改自己的网页程序;ftp 用户可能在上传软件到服务器;mysql 用户可能在执行自己的 SQL 查询,每个用户互不干扰,有条不紊地进行着自己的工作。与此同时,每个用户之间不能越权访问,比如 www 用户不能执行 mysql 用户的 SQL 查询操作,ftp 用户也不能修改 www 用户的网页程序。
不同用户具有不问的权限,毎个用户在权限允许的范围内完成不间的任务,Linux 正是通过这种权限的划分与管理,实现了多用户多任务的运行机制。
因此,如果要使用 Linux 系统的资源,就必须向系统管理员申请一个账户,然后通过这个账户进入系统(账户和用户是一个概念)。通过建立不同属性的用户,一方面可以合理地利用和控制系统资源,另一方面也可以帮助用户组织文件,提供对用户文件的安全性保护。
每个用户都有唯一的用户名和密码。在登录系统时,只有正确输入用户名和密码,才能进入系统和自己的主目录。
用户组是具有相同特征用户的逻辑集合。简单的理解,有时我们需要让多个用户具有相同的权限,比如查看、修改某一个文件的权限,一种方法是分别对多个用户进行文件访问授权,如果有 10 个用户的话,就需要授权 10 次,那如果有 100、1000 甚至更多的用户呢?
显然,这种方法不太合理。最好的方式是建立一个组,让这个组具有查看、修改此文件的权限,然后将所有需要访问此文件的用户放入这个组中。那么,所有用户就具有了和组一样的权限,这就是用户组。
将用户分组是 Linux 系统中对用户进行管理及控制访问权限的一种手段,通过定义用户组,很多程序上简化了对用户的管理工作。
用户和用户组的对应关系有以下 4 种:
用户和组之间的关系可以用下面的图表示:
登陆 Linux 系统时,虽然输入的是自己的用户名和密码,但其实 Linux 并不认识你的用户名称,它只认识用户名对应的 ID 号(也就是一串数字)。Linux 系统将所有用户的名称与 ID 的对应关系都存储在 /etc/passwd
文件中。说白了,用户名并无实际作用,仅是为了方便用户的记忆而已。
Linux 系统中,每个用户的 ID 细分为 2 种,分别是用户 ID(User ID,简称 UID)和组 ID(Group ID,简称 GID),这与文件有拥有者和拥有群组两种属性相对应。
那么读者可能会问,既然 Linux 系统不认识用户名,文件是如何判别它的拥有者名称和群组名称的呢?
每个文件都有自己的拥有者 ID 和群组 ID,当显示文件属性时,系统会根据 /etc/passwd
和 /etc/group
文件中的内容,分别找到 UID 和 GID 对应的用户名和群组名,然后显示出来(/etc/passwd 文件和 /etc/group 文件,下面第四节会有讲到
)。
用户和组信息的主要存储库是 /etc 中的 4 个文件:
/etc/passwd
是包含用户的基本信息的密码 文件,所有用户都可以对此文件执行读操作。/etc/shadow
是包含已加密的密码的影子密码 文件。/etc/group
是组 文件,包含组的基本信息和哪些用户属于它们。/etc/gshadow
是包含已加密的组密码的影子组 文件。细节说明:出于安全原因,密码 (/etc/passwd) 和组 (/etc/group) 文件都添加了影子文件。passwd 和 group 文件本身必须是所有用户可读的,但加密的密码不应是所有用户可读的。因此,影子文件包含加密的密码,而且这些文件仅能由 root 读取。suid 程序提供了必要的验证访问权,该程序具有根权限但可由任何用户运行。
首先我们来打开这个文件,看看到底包含哪些内容,执行命令如下:
[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 ...省略部分输出...
可以看到,/etc/passwd
文件中的内容非常规律,每行记录对应一个用户。
那么有些爱动脑筋的读者可能会问,Linux 系统中默认怎么会有这么多的用户?这些用户中的绝大多数是系统或服务正常运行所必需的用户,这种用户通常称为系统用户或伪用户。系统用户无法用来登录系统,但也不能删除,因为一旦删除,依赖这些用户运行的服务或程序就不能正常执行,会导致系统问题。
不仅如此,每行用户信息都以 ":" 作为分隔符,划分为 7 个字段,每个字段所表示的含义如下:
用户名:密码:UID(用户ID):GID(组ID):描述性信息:主目录(home目录):默认Shell
接下来,给大家逐个介绍这些字段。
用户名
用户名,就是一串代表用户身份的字符串。
前面讲过,用户名仅是为了方便用户记忆,Linux 系统是通过 UID 来识别用户身份,分配用户权限的。/etc/passwd
文件中就定义了用户名和 UID 之间的对应关系。
密码
"x" 表示此用户设有密码,但不是真正的密码,真正的密码保存在 /etc/shadow 文件中。Linux 系统把真正的加密密码串放置在 /etc/shadow 文件中,此文件只有 root 用户可以浏览和操作,这样就最大限度地保证了密码的安全。
需要注意的是,虽然 "x" 并不表示真正的密码,但也不能删除,如果删除了 "x",那么系统会认为这个用户没有密码,从而导致只输入用户名而不用输入密码就可以登陆(只能在使用无密码登录,远程是不可以的),除非特殊情况(如破解用户密码),这当然是不可行的。
UID
UID,也就是用户 ID。每个用户都有唯一的一个 UID,Linux 系统通过 UID 来识别不同的用户。
实际上,UID 就是一个 0~65535 之间的数,不同范围的数字表示不同的用户身份,具体如表 所示。
UID 范围 | 用户身份 |
---|---|
0 | 超级用户。UID 为 0 就代表这个账号是管理员账号。在 Linux 中,如何把普通用户升级成管理员呢?只需把其他用户的 UID 修改为 0 就可以了,这一点和 Windows 是不同的。不过不建议建立多个管理员账号。 |
1~499 | 系统用户(伪用户)。也就是说,此范围的 UID 保留给系统使用。其中,1~99 用于系统自行创建的账号;100~499 分配给有系统账号需求的用户。 其实,除了 0 之外,其他的 UID 并无不同,这里只是默认 500 以下的数字给系统作为保留账户,只是一个公认的习惯而已。 |
500~65535 | 普通用户。通常这些 UID 已经足够用户使用了。但不够用也没关系,2.6.x 内核之后的 Linux 系统已经可以支持 232 个 UID 了。 |
GID
全称“Group ID”,简称“组ID”,表示用户初始组的组 ID 号。这里需要解释一下初始组和附加组的概念。
举例来说,刚刚的 lamp 用户除属于初始组 lamp 外,我又把它加入了 users 组,那么 lamp 用户同时属于 lamp 组和 users 组,其中 lamp 是初始组,users 是附加组。
当然,初始组和附加组的身份是可以修改的,但是我们在工作中不修改初始组,只修改附加组,因为修改了初始组有时会让管理员逻辑混乱。
需要注意的是,在 /etc/passwd 文件的第四个字段中看到的 ID 是这个用户的初始组。
描述性信息
这个字段并没有什么重要的用途,只是用来解释这个用户的意义而已。
主目录
也就是用户登录后有操作权限的访问目录,通常称为用户的主目录。
例如,root 超级管理员账户的主目录为 /root
,普通用户的主目录为 /home/yourIDname
,即在 /home/
目录下建立和用户名相同的目录作为主目录,如 lamp 用户的主目录就是 /home/lamp/
目录。
默认的Shell
Shell 就是 Linux 的命令解释器,是用户和 Linux 内核之间沟通的桥梁。
我们知道,用户登陆 Linux 系统后,通过使用 Linux 命令完成操作任务,但系统只认识类似 0101 的机器语言,这里就需要使用命令解释器。也就是说,Shell 命令解释器的功能就是将用户输入的命令转换成系统可以识别的机器语言。
通常情况下,Linux 系统默认使用的命令解释器是 bash(/bin/bash),当然还有其他命令解释器,例如 sh、csh 等。
在 /etc/passwd
文件中,大家可以把这个字段理解为用户登录之后所拥有的权限。如果这里使用的是 bash 命令解释器,就代表这个用户拥有权限范围内的所有权限。例如:
[root@localhost ~]# vim /etc/passwd lamp:x:502:502::/home/lamp:/bin/bash
我手工添加了 lamp 用户,它使用的是 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
文件,用于存储 Linux 系统中用户的密码信息,又称为“影子文件”。
前面介绍了 /etc/passwd
文件,由于该文件允许所有用户读取,易导致用户密码泄露,因此 Linux 系统将用户的密码信息从 /etc/passwd
文件中分离出来,并单独放到了此文件中。
/etc/shadow 文件只有 root 用户拥有读权限,其他用户没有任何权限,这样就保证了用户密码的安全性。
我们先打开该文件看看,执行如下命令:
[root@localhost ~]#vim /etc/shadow root: $6$9w5Td6lg $bgpsy3olsq9WwWvS5Sst2W3ZiJpuCGDY.4w4MRk3ob/i85fl38RH15wzVoom ff9isV1 PzdcXmixzhnMVhMxbvO:15775:0:99999:7::: bin:*:15513:0:99999:7::: daemon:*:15513:0:99999:7::: …省略部分输出…
同 /etc/passwd
文件一样,文件中每行代表一个用户,同样使用 ":" 作为分隔符,不同之处在于,每行用户信息被划分为 9 个字段。每个字段的含义如下:
用户名:加密密码:最后一次修改时间:最小修改时间间隔:密码有效期:密码需要变更前的警告天数:密码过期后的宽限时间:账号失效时间:保留字段
需要注意的是,加密密码:
这里保存的是真正加密的密码。目前 Linux 的密码采用的是 SHA512 散列加密算法,原来采用的是 MD5 或 DES 加密算法。SHA512 散列加密算法的加密等级更高,也更加安全。
注意,这串密码产生的乱码不能手工修改,如果手工修改,系统将无法识别密码,导致密码失效。很多软件透过这个功能,在密码串前加上 "!"、"*" 或 "x" 使密码暂时失效。
所有伪用户的密码都是 "!!" 或 "*",代表没有密码是不能登录的。当然,新创建的用户如果不设定密码,那么它的密码项也是 "!!",代表这个用户没有密码,不能登录。
/ect/group
文件是用户组配置文件,即用户组的所有信息都存放在此文件中。
此文件是记录组 ID(GID)和组名相对应的文件。前面讲过,etc/passwd
文件中每行用户信息的第四个字段记录的是用户的初始组 ID,那么,此 GID 的组名到底是什么呢?就要从 /etc/group 文件中查找。
/etc/group 文件的内容可以通过 Vim 看到:
[root@localhost ~]#vim /etc/group root:x:0: bin:x:1:bin,daemon daemon:x:2:bin,daemon …省略部分输出… lamp:x:502:
可以看到,此文件中每一行各代表一个用户组。在前面章节中,我们曾创建 lamp 用户,系统默认生成一个 lamp 用户组,在此可以看到,此用户组的 GID 为 502,目前它仅作为 lamp 用户的初始组。
各用户组中,还是以 ":" 作为字段之间的分隔符,分为 4 个字段,每个字段对应的含义为:
组名:密码:GID:该用户组中的用户列表
接下来,分别介绍各个字段具体的含义。
组名
也就是是用户组的名称,有字母或数字构成。同 /etc/passwd
中的用户名一样,组名也不能重复。
组密码
和 /etc/passwd
文件一样,这里的 "x" 仅仅是密码标识,真正加密后的组密码默认保存在 /etc/gshadow
文件中。
不过,用户设置密码是为了验证用户的身份,那用户组设置密码是用来做什么的呢?用户组密码主要是用来指定组管理员的,由于系统中的账号可能会非常多,root 用户可能没有时间进行用户的组调整,这时可以给用户组指定组管理员,如果有用户需要加入或退出某用户组,可以由该组的组管理员替代 root 进行管理。但是这项功能目前很少使用,我们也很少设置组密码。如果需要赋予某用户调整某个用户组的权限,则可以使用 sudo 命令代替。
组ID (GID)
就是群组的 ID 号,Linux 系统就是通过 GID 来区分用户组的,同用户名一样,组名也只是为了便于管理员记忆。
这里的组 GID 与 /etc/passwd
文件中第 4 个字段的 GID 相对应,实际上,/etc/passwd
文件中使用 GID 对应的群组名,就是通过此文件对应得到的。
组中的用户
此字段列出每个群组包含的所有用户。需要注意的是,如果该用户组是这个用户的初始组,则该用户不会写入这个字段,可以这么理解,该字段显示的用户都是这个用户组的附加用户。
举个例子,lamp 组的组信息为 "lamp:x:502:
",可以看到,第四个字段没有写入 lamp 用户,因为 lamp 组是 lamp 用户的初始组。如果要查询这些用户的初始组,则需要先到 /etc/passwd
文件中查看 GID(第四个字段),然后到 /etc/group
文件中比对组名。
每个用户都可以加入多个附加组,但是只能属于一个初始组。所以我们在实际工作中,如果需要把用户加入其他组,则需要以附加组的形式添加。例如,我们想让 lamp 也加入 root 这个群组,那么只需要在第一行的最后一个字段加入 lamp,即 root:x:0:lamp
就可以了。
一般情况下,用户的初始组就是在建立用户的同时建立的和用户名相同的组。
到此,我们已经学习了/etc/passwd
、/etc/shadow
、/etc/group
,它们之间的关系可以这样理解,即先在 /etc/group
文件中查询用户组的 GID 和组名;然后在 /etc/passwd 文件中查找该 GID 是哪个用户的初始组,同时提取这个用户的用户名和 UID;最后通过 UID 到 /etc/shadow
文件中提取和这个用户相匹配的密码。
前面讲过,/etc/passwd
文件存储用户基本信息,同时考虑到账户的安全性,将用户的密码信息存放另一个文件 /etc/shadow
中。/etc/gshadow
文件也是如此,组用户信息存储在/etc/group
文件中,而将组用户的密码信息存储在/etc/gshadow
文件中。
首先,我们借助 Vim 命令查看一下此文件中的内容:
[root@localhost ~]#vim /etc/gshadow root::: bin:::bin, daemon daemon:::bin, daemon ...省略部分输出... lamp:!::
文件中,每行代表一个组用户的密码信息,各行信息用 ":" 作为分隔符分为 4 个字段,每个字段的含义如下:
组名:加密密码:组管理员:组附加用户列表
组名
同 /etc/group
文件中的组名相对应。
组密码
对于大多数用户来说,通常不设置组密码,因此该字段常为空,但有时为 "!",指的是该群组没有组密码,也不设有群组管理员。
组管理员
从系统管理员的角度来说,该文件最大的功能就是创建群组管理员。那么,什么是群组管理员呢?
考虑到 Linux 系统中账号太多,而超级管理员 root 可能比较忙碌,因此当有用户想要加入某群组时,root 或许不能及时作出回应。这种情况下,如果有群组管理员,那么他就能将用户加入自己管理的群组中,也就免去麻烦 root 了。
不过,由于目前有 sudo 之类的工具,因此群组管理员的这个功能已经很少使用了。
组中的附加用户
该字段显示这个用户组中有哪些附加用户,和 /etc/group
文件中附加组显示内容相同。
普通用户的权限非常的低,就连在系统里安装软件的权限都没有,很多时候可以临时给普通用户以特权,就是sudo(在命令前添加sudo)。比如:
sudo cat /etc/shadow
完成后需要您输入root的密码,这样 就可以假借root身份了,centos默认普通用户是没有sudo权限的,这与主要以桌面版为主的Ubuntu和Fedora不同,如需给予用户root特权,就需要更改/etc/sudoers文件,修改内容。
Linux 系统中,可以使用 useradd 命令新建用户,此命令的基本格式如下:
[root@localhost ~]#useradd [选项] 用户名
该命令常用的选项及各自的含义,如表 所示。
选项 | 含义 |
---|---|
-u UID | 手工指定用户的 UID,注意 UID 的范围(不要小于 500)。 |
-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 之间,供系统程序使用的用户。由于系统用户主要用于运行系统所需服务的权限配置,因此系统用户的创建默认不会创建主目录。 |
其实,系统已经帮我们规定了非常多的默认值,在没有特殊要求下,无需使用任何选项即可成功创建用户。例如:
[root@localhost ~]# useradd lamp
此行命令就表示创建 lamp 普通用户。
学习 useradd 命令我们知道,使用此命令创建新用户时,并没有设定用户密码,因此还无法用来登陆系统,那么 passwd 就是密码配置命令 。
passwd 命令的基本格式如下:
[root@localhost ~]#passwd [选项] 用户名
选项 | 含义 |
---|---|
-S | 查询用户密码的状态,也就是 /etc/shadow 文件中此用户密码的内容。仅 root 用户可用; |
-l | 暂时锁定用户,该选项会在 /etc/shadow 文件中指定用户的加密密码串前添加 "!",使密码失效。仅 root 用户可用; |
-u | 解锁用户,和 -l 选项相对应,也是只能 root 用户使用; |
--stdin | 可以将通过管道符输出的数据作为用户的密码。主要在批量添加用户时使用; |
-n 天数 | 设置该用户修改密码后,多长时间不能再次修改密码,也就是修改 /etc/shadow 文件中各行密码的第 4 个字段; |
-x 天数 | 设置该用户的密码有效期,对应 /etc/shadow 文件中各行密码的第 5 个字段; |
-w 天数 | 设置用户密码过期前的警告天数,对于 /etc/shadow 文件中各行密码的第 6 个字段; |
-i 日期 | 设置用户密码失效日期,对应 /etc/shadow 文件中各行密码的第 7 个字段。 |
例如,我们使用 root 账户修改 lamp 普通用户的密码,可以使用如下命令:
[root@localhost ~]#passwd lamp Changing password for user lamp. New password: <==直接输入新的口令,但屏幕不会有任何反应 BAD PASSWORD: it is WAY too short <==口令太简单或过短的错误!这里只是警告信息,输入的密码依旧能用 Retype new password: <==再次验证输入的密码,再输入一次即可 passwd: all authentication tokens updated successfully. <==提示修改密码成功
当然,也可以使用 passwd 命令修改当前系统已登录用户的密码,但要注意的是,需省略掉 "选项" 和 "用户名"。例如,我们登陆 lamp 用户,并使用 passwd 命令修改 lamp 的登陆密码,执行过程如下:
[root@localhost ~]#passwd #passwd直接回车代表修改当前用户的密码 Changing password for user vbird2. Changing password for vbird2 (current) UNIX password: <==这里输入『原有的旧口令』 New password: <==这里输入新口令 BAD PASSWORD: it is WAY too short <==口令检验不通过,请再想个新口令 New password: <==这里再想个来输入吧 Retype new password: <==通过口令验证!所以重复这个口令的输入 passwd: all authentication tokens updated successfully. <==成功修改用户密码
注意,普通用户只能使用 passwd 命令修改自己的密码,而不能修改其他用户的密码。
usermod 命令,该命令专门用于修改用户信息。
这里一定要分清 useradd 命令和 usermod 命令的区别,前者用于添加用户,当然,添加用户时可以对用户信息进行定制;后者针对与已存在的用户,使用该命令可以修改它们的信息。
usermod 命令的基本格式如下:
[root@localhost ~]#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 命令提供的选项和 useradd 命令的选项相似,因为 usermod 命令就是用来调整使用 useradd 命令添加的用户信息的。
不过,相比 useradd 命令,usermod 命令还多出了几个选项,即 -L 和 -U,作用分别与 passwd 命令的 -l 和-u 相同。需要注意的是,并不是所有的 Linux 发行版都包含这个命令,因此,使用前可以使用 man usermod 命令确定系统是否支持。
此命令对用户的临时锁定,同 passwd 命令一样,都是在 /etc/passwd 文件目标用户的加密密码字段前添加 "!",使密码失效;反之,解锁用户就是将添加的 "!" 去掉。
除了 passwd -S
命令可以查看用户的密码信息外,还可以利用 chage 命令,它可以显示更加详细的用户密码信息,并且和 passwd 命令一样,提供了修改用户密码信息的功能。
如果你要修改用户的密码信息,我个人建议,还是直接修改 /etc/shadow 文件更加方便。
我们来看 chage 命令的基本格式:
[root@localhost ~]#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@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
读者可能会问,既然直接修改用户密码文件更方便,为什么还要讲解 chage 命令呢?因为 chage 命令除了修改密码信息的功能外,还可以强制用户在第一次登录后,必须先修改密码,并利用新密码重新登陆系统,此用户才能正常使用。
userdel 命令功能很简单,就是删除用户的相关数据。此命令只有 root 用户才能使用。
通过前面的学习我们知道,用户的相关数据包含如下几项:
其实,userdel 命令的作用就是从以上文件中,删除与指定用户有关的数据信息。
userdel 命令的语法很简单,基本格式如下:
[root@localhost ~]# userdel -r 用户名
-r 选项表示在删除用户的同时删除用户的家目录。
注意,在删除用户的同时如果不删除用户的家目录,那么家目录就会变成没有属主和属组的目录,也就是垃圾文件。
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@localhost ~]# id lamp uid=501(lamp) gid=501(lamp) groups=501(lamp),0(root) #大家发现root组中加入了lamp用户的附加组信息
su 是最简单的用户切换命令,通过该命令可以实现任何身份的切换,包括从普通用户切换为 root 用户、从 root 用户切换为普通用户以及普通用户之间的切换。
普通用户之间切换以及普通用户切换至 root 用户,都需要知晓对方的密码,只有正确输入密码,才能实现切换;从 root 用户切换至其他用户,无需知晓对方密码,直接可切换成功。
su 命令的基本格式如下:
[root@localhost ~]# su [选项] 用户名
选项 | 含义 |
---|---|
- | 当前用户不仅切换为指定用户的身份,同时所用的工作环境也切换为此用户的环境(包括 PATH 变量、MAIL 变量等),使用 - 选项可省略用户名,默认会切换为 root 用户。 |
-l | 同 - 的使用类似,也就是在切换用户身份的同时,完整切换工作环境,但后面需要添加欲切换的使用者账号。 |
-p | 表示切换为指定用户的身份,但不改变当前的工作环境(不使用切换用户的配置文件)。 |
-m | 和 -p 一样; |
-c 命令 | 仅切换用户执行一次命令,执行后自动切换回来,该选项后通常会带有要执行的命令。 |
【例 1】
[lamp@localhost ~]$ su -root 密码: <-- 输入 root 用户的密码 #"-"代表连带环境变量一起切换,不能省略
【例 2】
[lamp@localhost ~]$ whoami lamp #当前我是lamp [lamp@localhost ~]$ su - -c "useradd user1" root 密码: #不切换成root,但是执行useradd命令添加user1用户 [lamp@localhost ~]$ whoami lamp #我还是lamp [lamp@localhost ~]$ grep "user1' /etc/passwd userl:x:502:504::/home/user1:/bin/bash #user用户已经添加了
除了像例 2 这样,执行一条命令后用户身份会随即自动切换回来,其他切换用户的方式不会自动切换,只能使用 exit 命令进行手动切换,例如:
[lamp@localhost ~]$ whoami lamp #当前我是lamp [lamp@localhost ~]$ su - lamp1 Password: <--输入lamp1用户的密码 #切换至 lamp1 用户的工作环境 [lamp@localhost ~]$ whoami lamp1 #什么也不做,立即退出切换环境 [lamp1@localhost ~]$ exit logout [lamp@localhost ~]$ whoami lamp
su 和 su - 的区别
注意,使用 su 命令时,有 - 和没有 - 是完全不同的,- 选项表示在切换用户身份的同时,连当前使用的环境变量也切换成指定用户的。我们知道,环境变量是用来定义操作系统环境的,因此如果系统环境没有随用户身份切换,很多命令无法正确执行。
举个例子,普通用户 lamp 通过 su 命令切换成 root 用户,但没有使用 - 选项,这样情况下,虽然看似是 root 用户,但系统中的 $PATH 环境变量依然是 lamp 的(而不是 root 的),因此当前工作环境中,并不包含 /sbin、/usr/sbin等超级用户命令的保存路径,这就导致很多管理员命令根本无法使用。不仅如此,当 root 用户接受邮件时,会发现收到的是 lamp 用户的邮件,因为环境变量 $MAIL 也没有切换。
可以这样理解它们之间的区别,即有 - 选项,切换用户身份更彻底;反之,只切换了一部分,这会导致某些命令运行出现问题或错误(例如无法使用 service 命令)。
whoami 命令和 who am i 命令是不同的 2 个命令,前者用来打印当前执行操作的用户名,后者则用来打印登陆当前 Linux 系统的用户名。
为了能够更好地区分这 2 个命令的功能,举个例子,首先使用用户名为“Cyuyan”登陆 Linux 系统,然后执行如下命令:
[Cyuyan@localhost ~]$ whoami Cyuyan [Cyuyan@localhost ~]$ who am i Cyuyan pts/0 2017-10-09 15:30 (:0.0)
在此基础上,使用 su 命令切换到 root 用户下,再执行一遍上面的命令:
[Cyuyan@localhost ~] su - root [root@localhost ~]$ whoami root [root@localhost ~]$ who am i Cyuyan pts/0 2017-10-09 15:30 (:0.0)
看到了吗?在未切换用户身份之前,whoami 和 who am i 命令的输出是一样的,但使用 su 命令切换用户身份后,使用 whoami 命令打印的是切换后的用户名,而 who am i 命令打印的仍旧是登陆系统时所用的用户名。
添加用户组的命令是 groupadd,命令格式如下:
[root@localhost ~]# groupadd [选项] 组名
选项 | 含义 |
---|---|
-g GID | 指定组 ID; |
-r | 创建系统群组; |
使用 groupadd 命令创建新群组非常简单,例如:
[root@localhost ~]# groupadd group1 #添加group1组 [root@localhost ~]# grep "group1" /etc/group /etc/group:group1:x:502: /etc/gshadow:group1:!::
groupmod 命令用于修改用户组的相关信息,命令格式如下:
[root@localhost ~]# groupmod [选现] 组名
选项 | 含义 |
---|---|
-g GID | 修改组 ID; |
-n 新组名 | 修改组名; |
【例 1】
[root@localhost ~]# groupmod -n testgrp group1 #把组名group1修改为testgrp [root@localhost ~]# grep "testgrp" /etc/group testgrp:x:502: #注意GID还是502,但是组名已经改变
不过大家还是要注意,用户名不要随意修改,组名和 GID 也不要随意修改,因为非常容易导致管理员逻辑混乱。如果非要修改用户名或组名,则建议大家先删除旧的,再建立新的。
groupdel 命令用于删除用户组(群组),此命令基本格式为:
[root@localhost ~]#groupdel 组名
通过前面的学习不难猜测出,使用 groupdel 命令删除群组,其实就是删除 /etc/gourp 文件和 /etc/gshadow 文件中有关目标群组的数据信息。
例如,删除前面章节中用 groupadd 命令创建的群组 group1,执行命令如下:
[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 命令随意删除群组。此命令仅适用于删除那些 "不是任何用户初始组" 的群组,换句话说,如果有群组还是某用户的初始群组,则无法使用 groupdel 命令成功删除。例如:
[root@localhost ~]# useradd temp #运行如下命令,可以看到 temp 用户建立的同时,还创建了 temp 群组,且将其作为 temp用户的初始组(组ID都是 505) [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'
可以看到,groupdel 命令删除 temp 群组失败,且提示“不能删除 temp 用户的初始组”。如果一定要删除 temp 群组,要么修改 temp 用户的 GID,也就是将其初始组改为其他群组,要么先删除 temp 用户。
切记,虽然我们已经学了如何手动删除群组数据,但胡乱地删除群组可能会给其他用户造成不小的麻烦,因此更改文件数据要格外慎重。
为了避免系统管理员(root)太忙碌,无法及时管理群组,我们可以使用 gpasswd 命令给群组设置一个群组管理员,代替 root 完成将用户加入或移出群组的操作。
gpasswd 命令的基本格式如下:
[root@localhost ~]# gpasswd 选项 组名
选项 | 功能 |
---|---|
选项为空时,表示给群组设置密码,仅 root 用户可用。 | |
-A user1,... | 将群组的控制权交给 user1,... 等用户管理,也就是说,设置 user1,... 等用户为群组的管理员,仅 root 用户可用。 |
-M user1,... | 将 user1,... 加入到此群组中,仅 root 用户可用。 |
-r | 移除群组的密码,仅 root 用户可用。 |
-R | 让群组的密码失效,仅 root 用户可用。 |
-a user | 将 user 用户加入到群组中。 |
-d user | 将 user 用户从群组中移除。 |
除 root 可以管理群组外,可设置多个普通用户作为群组的管理员,但也只能做“将用户加入群组”和“将用户移出群组”的操作。
【例 1】
#创建新群组 group1,并将群组交给 lamp 管理 [root@localhost ~]# groupadd group1 <-- 创建群组 [root@localhost ~]# gpasswd group1 <-- 设置密码吧! Changing the password for group group1 New Password: Re-enter new password: [root@localhost ~]# gpasswd -A lamp group1 <==加入群组管理员为 lamp [root@localhost ~]# grep "group1" /etc/group /etc/gshadow /etc/group:group1:x:506: /etc/gshadow:group1:$1$I5ukIY1.$o5fmW.cOsc8.K.FHAFLWg0:lamp:
可以看到,此时 lamp 用户即为 group1 群组的管理员。
【例 2】
#以lamp用户登陆系统,并将用户 lamp 和 lamp1 加入group1群组。 [lamp@localhost ~]#gpasswd -a lamp group1 [lamp@localhost ~]#gpasswd -a lamp1 group1 [lamp@localhost ~]#grep "group1" /etc/group group1:x:506:lamp,lamp1
前面讲过,使用 usermod -G
命令也可以将用户加入群组,但会产生一个问题,即使用此命令将用户加入到新的群组后,该用户之前加入的那些群组都将被清空。例如:
#新创建一个群组group2 [root@localhost ~]# groupadd group2 [root@localhost ~]# usermod -G group2 lamp [root@localhost ~]# grep "group2" /etc/group group2:x:509:lamp [root@localhost ~]# grep "group1" /etc/group group1:x:506:lamp1
对比例 2 可以发现,虽然使用 usermod 命令成功地将 lamp 用户加入在 group2 群组中,但 lamp 用户原本在 group1 群组中,此时却被移出,这就是使用 usermod 命令造成的。
因此,将用户加入或移出群组,最好使用 gpasswd 命令。
记住!!有关于删除的一定要三思而后行!!!!