2.2.1 新增和删除用户

1.新增用户:useradd

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


  1. [root@localhost ~]# useradd john

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

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

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

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

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

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


  1. [root@localhost ~]# cd etcskel/
  2. [root@localhost skel]# touch TempFile
  3. [root@localhost skel]# useradd john01
  4. [root@localhost skel]# cd homejohn01/
  5. [root@localhost john]# ls -l
  6. total 0
  7. -rw-r--r-- 1 john john 0 Oct 25 23:41 TempFile

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

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


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

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


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

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


  1. [root@localhost skel]# useradd -d homemydir3 user3

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

2.修改密码:passwd

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


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

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

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


  1. [john@localhost ~]$ passwd
  2. Changing password for user john.
  3. Changing password for john
  4. (current) UNIX password:
  5. New UNIX password:
  6. Retype new UNIX password:
  7. passwd: all authentication tokens updated successfully.

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


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

3.修改用户:usermod

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


  1. [root@localhost ]# useradd alice
  2. [root@localhost ]# passwd alice
  3. Changing password for user alice.
  4. New UNIX password:
  5. Retype new UNIX password:
  6. passwd: all authentication tokens updated successfully.

现在看一下用户alice在etcpasswd中的记录:


  1. [root@localhost ~]# cat etcpasswd | grep alice
  2. alice:x:503:503::homealice:/bin/bash

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


  1. [root@localhost ~]# usermod -d homealice_new -m alice

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


  1. [root@localhost ~]# cat etcpasswd | grep alice
  2. alice:x:503:503::homealice_new:/bin/bash

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


  1. [root@localhost ~]# cat etcshadow | grep alice
  2. alice:$1$Doi70VUY$Gmjq6HijgNLsm7xnys4Lw/:15642:0:99999:7:::
  3. [root@localhost ]# usermod -L alice
  4. [root@localhost ]# cat etcshadow | grep alice
  5. alice:!$1$Doi70VUY$Gmjq6HijgNLsm7xnys4Lw/:15642:0:99999:7:::

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


  1. [root@localhost ]# usermod -U alice
  2. [root@localhost ]# cat etcshadow | grep alice
  3. alice:$1$Doi70VUY$Gmjq6HijgNLsm7xnys4Lw/:15642:0:99999:7:::

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

4.删除用户:userdel

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


  1. [root@localhost ~]# userdel alice

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