Linux系统命令及Shell脚本实践指南
上QQ阅读APP看书,第一时间看更新

2.2 Linux账号管理

Linux账号管理是Linux系统管理员的一个重要工作,具体来说,涉及账号的添加、删除和修改等操作。从账号类型来说,Linux用户按照使用方式分为三种:一是根用户,二是系统用户,三是普通用户。

2.2.1 新增和删除用户

1.新增用户:useradd

useradd命令用于添加新的用户。其使用方式很简单,通常情况下可直接在该命令后跟上新增的用户名。比如,需要新建一个叫john的用户,直接输入命令useradd john即可。但是对于系统来说,完成这个命令需要在后台执行很多对用户来说毫无感知的行为。

[root@localhost ~]# useradd john

首先,系统需要将用户信息记录在/etc/passwd中,一般会在/etc/passwd和/etc/shadow末尾追加一条记录,同时会分配给该用户一个UID。

接着,要为该用户自动创建家目录。家目录以创建的用户名为目录名,创建的路径在/home目录中。比如,在上述案例中,创建的目录将是/home/john。

然后,复制/etc/skel下所有的文件至/home/john。说明一下,如果你使用ls-l /etc/skel命令查看,可以发现这个目录下“什么都没有”,但事实上,该目录下面有很多隐藏文件,使用命令ls-la /etc/skel就可以看到其中还是有好几个文件的。

最后,新建一个与该用户名一样的用户组,也就是说当创建用户john的时候,也同时创建了一个叫john的用户组,而用户john默认属于john用户组(关于用户组的概念将在下一节中讲到)。

这里需要对/etc/skel目录做一些说明。系统在添加用户时,需要预先为这个用户创建一些默认的“配置文件”,而默认配置的就是/etc/skel目录下的几个隐藏文件。可以说,/etc/skel实际上是创建用户时的“模板”。

做一个小实验,实验过程如下所示:

[root@localhost ~]# cd /etc/skel/
[root@localhost skel]# touch TempFile
[root@localhost skel]# useradd john01
[root@localhost skel]# cd /home/john01/
[root@localhost john]# ls-l
total 0
-rw-r--r-- 1 john john 0 Oct 25 23:41 TempFile

也就是说,手工在/etc/skel中创建一个文件TempFile(touch命令就是创建文件的命令),然后再添加用户john01时,在家目录/home/john01中也会同样发现这个文件。这说明其实在创建用户后,会将/etc/skel中的所有文件直接复制过来。

在使用useradd添加用户时,系统会给该用户自动分配一个UID,但是也可以通过使用-u参数实现指定UID,当然,必须要指定的UID不与其他用户冲突才可以。下面的例子就创建了一个UID为555的账号:

[root@localhost skel]# useradd-u 555 user1

既然可以指定新创建用户的UID,也应该可以指定GID吧?答案是肯定的,使用-g参数可以做到这点。下面就是创建用户user2时,指定了该用户所属的Group是user1。

[root@localhost skel]# useradd-g user1 user2

还可以使用-d参数指定该用户的家目录,而不是使用系统默认创建的家目录。像下面这样就可以指定/home/mydir3作为user3用户的家目录:

[root@localhost skel]# useradd-d /home/mydir3 user3

useradd命令还有很多其他一些并不常用的参数,具体的参数和说明可以使用命令man useradd获得帮助。

2.修改密码:passwd

创建用户后,该用户实际上还没有登录系统的权限,因为在不设置密码的情况下,在/etc/shadow中该用户记录中以冒号分隔的第二列将显示为两个感叹号“!!”,这说明不允许该用户登录系统。因此,需要同时设置用户的密码才行,设置命令是passwd后接用户名,如下所示:

[root@localhost skel]# passwd john
Changing password for user john.
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully.

这里输入两遍需要设置的密码即可。如果不输入密码而是直接按回车键两次,密码会设置失败,如果输入了太过简单的密码,系统将会显示“BAD PASSWORD: it is too simplistic/systematic”。虽然系统会提示密码太过简单,但还是会接受其作为该用户的密码。

普通用户也可以使用passwd来修改自己的密码,但是需要提供当前用户的密码才可以,并且密码不能太过简单,因为系统会拒绝普通用户设置过于简单的密码。命令如下所示:

[john@localhost ~]$ passwd
Changing password for user john.
Changing password for john
(current) UNIX password:
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully.

与root用户使用这个命令的方式不同,普通用户在运行这个命令时,后面不能跟参数,哪怕是自己的用户名也不行。比如说使用john登录,然后采用passwd john命令,系统就会立刻报错,提示只有root用户才可以在后面跟上用户名,如下所示:

[john@localhost ~]$ passwd john
passwd: Only root can specify a user name.

3.修改用户:usermod

有时候可能会由于某些具体的场景,而需要对已存在的用户进行修改,这时候就需要使用usermod命令了。比如说,下面创建了一个用户并设置了密码:

[root@localhost ~]# useradd alice
[root@localhost ~]# passwd alice
Changing password for user alice.
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully.

现在看一下用户alice在/etc/passwd中的记录:

[root@localhost ~]# cat /etc/passwd | grep alice
alice:x:503:503::/home/alice:/bin/bash

冒号隔开的第五列是用户alice的家目录,如果希望修改家目录为/home/alice_new,可使用以下命令对alice的家目录做修改:

[root@localhost ~]# usermod-d /home/alice_new-m alice

其中,-m参数的作用是,如果指定用户的家目录存在,就自动创建新目录/home/alice_new,并使用该目录作为alice的新家目录。如果没有这个参数,系统会报一个错误:usermod: user /home/alice_new does not exist。再看一下alice在/etc/passwd中的记录,大家可以发现,第五列的家目录发生了变化:

[root@localhost ~]# cat /etc/passwd | grep alice
alice:x:503:503::/home/alice_new:/bin/bash

也许会因为某些原因,账号alice现在还不适合使用(如发现账号异常),需要暂时将这个账号冻结起来,这时,可以使用-L参数实现此目的。在操作之前先看一下/etc/shadow中关于alice的内容,然后再进行冻结操作,最后再看一下/etc/shadow,看看有什么不同。

[root@localhost ~]# cat /etc/shadow | grep alice
alice:$1$Doi70VUY$Gmjq6HijgNLsm7xnys4Lw/:15642:0:99999:7:::
[root@localhost ~]# usermod-L alice
[root@localhost ~]# cat /etc/shadow | grep alice
alice:!$1$Doi70VUY$Gmjq6HijgNLsm7xnys4Lw/:15642:0:99999:7:::

你可能已注意到,在冒号隔开的第二列,也就是密码处多了一个感叹号,这表示该账号已被冻结。使用-U参数可以解锁,而且可以看到密码又恢复如从前了。

[root@localhost ~]# usermod-U alice
[root@localhost ~]# cat /etc/shadow | grep alice
alice:$1$Doi70VUY$Gmjq6HijgNLsm7xnys4Lw/:15642:0:99999:7:::

其实usermod命令就是在对/etc/passwd和/etc/shadow文件做一些修改而已。明白了这个道理之后,就算不使用这个命令依然可以手工对用户进行修改操作。usermod还有其他一些不常用的参数,具体的参数和说明可以使用man usermod命令获得帮助。

4.删除用户:userdel

用户管理除了创建、修改用户之外,有时候也需要删除用户。对应的命令是userdel。例如现在需要删除alice用户:

[root@localhost ~]# userdel alice

使用这个命令会将删除alice在/etc/passwd和/etc/shadow中的记录。但是从数据安全方面考虑,默认情况下,删除用户时并不会删除原来用户的家目录和邮件信息。可以使用-r参数同时删除用户家目录和该用户的邮件。注意,一旦执行了这条命令,该用户的相关文件就会被全部删除。

2.2.2 新增和删除用户组

1.增加用户组:groupadd

上一节中我们知道,在添加用户的时候系统默认会创建一个与用户名一样的用户组。其实也可以直接创建用户组,新增用户组的命令是groupadd,后接用户组名称作为其参数。在Linux中,使用/etc/group文件来记录用户组。如下所示为使用groupadd命令增加一个group1组:

[root@localhost ~]# groupadd group1

按回车键后,注意看/etc/group的最后一行,在本例中,添加的用户组group1的GID为503。

[root@localhost ~]# cat /etc/group
......(略去内容)......
group1:x:503:

在/etc/group文件中,每一行就代表一个用户组,其格式是使用3个分隔号“:”隔开的4列。第一列是用户组名,第二列代表密码(但是并不使用),第三列代表用户组的数字ID,第四列是组成员,这里为空说明还没有任何用户属于这个组。

2.删除用户组:groupdel

删除用户组的命令是groupdel,后接要被删除的用户组名作为其参数。这里需要注意的是,如果已有用户属于这个试图删除的组,该操作会失败。groupdel命令的使用方式如下:

[root@localhost ~]# groupdel group1

2.2.3 检查用户信息

1.查看用户:users、who、w

使用命令users可以查看当前系统有哪些用户。比如,在当前的系统中运行users命令,就会发现有两个root在当前机器上登录。实际上,Linux会把所有来自不同终端的活动定义为一个会话,从who命令的输出,可以看出root用户是通过不同的终端登录到系统中的。users命令相对比较简单,所以列出的信息也比较少,可以使用命令who来看到更多信息,如下所示:

[root@localhost ~]# users
root root
[root@localhost ~]# who
root     tty1         2012-11-01 23:00
root     pts/0        2012-11-01 22:56 (192.168.179.1)

命令显示的结果有3列,第一列是登录用户的用户名,第二列是用户登录的终端,第三列是用户登录的时间。如果是通过远程网络登录,则同时会显示远程主机的主机名或IP地址。还可以使用命令w看到更详细的信息,如下所示:

[root@localhost ~]# w
23:21:30 up 27 min,2 users,load average: 0.00,0.00,0.00
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
root     tty1    -                23:00    7.00s  0.02s  0.02s-bash
root     pts/0    192.168.179.1    22:56    0.00s  0.03s  0.00s w

w命令的第一行会显示当前时间、系统运行时间、已登录的用户数量和系统负载。下面显示的信息分为8列,每一列解释如下。

第一列:登录用户的用户名。

第二列:用户登录终端。

第三列:如果用户从网络登录,则显示远程主机的主机名或IP地址。

第四列:用户登录时间。

第五列:用户闲置时间。

第六列:与终端相关的当前所有运行进程消耗的CPU时间总量。

第七列:当前WHAT列所对应的进程所消耗的CPU时间总量。

第八列:用户当前运行的进程。

2.调查用户:finger

finger命令在不加任何参数的情况下,同样会显示系统的登录用户,如下所示:

[root@localhost ~]# finger
Login     Name       Tty      Idle  Login Time   Office    Office Phone
root      root       tty1       22  Nov  1 23:00
root      root       pts/0          Nov  1 22:56 (192.168.179.1)

如果在finger后跟上某个用户名,则显示该用户更详细的信息,如下所示:

[root@localhost ~]# finger user1
Login: user1                          Name: (null)
Directory: /home/user1                Shell: /bin/bash
Never logged in. #显示用户最近一次登录到系统中的时间
No mail. #显示邮件信息
No Plan. #显示计划信息