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. #显示计划信息