Linux系统中的用户分为3类,即普通用户、根用户、系统用户。
- 普通用户是指所有使用Linux系统的真实用户,这类用户可以使用用户名及密码登录系统。一般来说普通用户只能在其家目录、系统临时目录或其他经过授权的目录中操作。
- 根用户也就是root用户,它的ID是0,也被称为超级用户,root账户拥有对系统的完全控制权:可以修改、删除任何文件,运行任何命令。
- 系统用户是指系统运行时必须有的用户,但并不是指真实的使用者。
比如在RedHat或CentOS下运行网站服务时,需要使用系统用户apache来运行httpd进程,而运行MySQL数据库服务时,需要使用系统用户mysql来运行mysqld进程。在RedHat或CentOS下,系统用户的ID范围是1~499。
用来区分不同用户的数字被称为User ID,简称UID。系统会自动记录“用户名”和UID的对应关系。
不同的用户组同样也是用数字来区分的,这种用于区分不同用户组的ID被称为Group ID,也就是GID。
UID和GID又有什么联系呢?事实上,在Linux下每个用户都至少属于一个组。
如何查看自己的UID和GID呢?要确认自己的UID,可以使用以下id命令来获得:
[root@localhost ~]# id
uid=0(root)gid=0(root)groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)
确认自己所属的用户组,可以使用以下groups命令来获得:
[root@localhost ~]# groups
root bin daemon sys adm disk wheel
如果要查询当前在线用户,可在用户登录以后,使用命令who看到目前登录在系统中的所有用户。
[root@localhost ~]# who
root tty1 2012-10-22 00:13
root pts/0 2012-10-22 21:20 (192.168.179.1)
john pts/1 2012-10-22 22:35 (192.168.179.1)
在登录Linux时必须要输入用户名和密码。系统用来记录用户名、密码最重要的两个文件就是/etc/passwd和/etc/shadow。
以下是/etc/passwd中的几行内容:
[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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
......(略去内容)......
LINUX将密码相关的信息保存到/etc/shadow中,而且默认只有root用户才有读的权限,其他人完全没有读取这个文件的可能。这种密码保存方式被称为“影子密码”。
/etc/shadow也是由冒号“:”隔开的,不同的是这里是8个冒号隔开的9列。
需要新建一个叫john的用户,直接输入命令useradd john即可
[root@localhost ~]# useradd john
创建用户的过程
- 首先,系统需要将用户信息记录在/etc/passwd中,一般会在/etc/passwd和/etc/shadow末尾追加一条记录,同时会分配给该用户一个UID。
- 接着,要为该用户自动创建家目录。家目录以创建的用户名为目录名,创建的路径在/home目录中。比如,在上述案例中,创建的目录将是/home/john。
- 然后,复制/etc/skel下所有的文件至/home/john。
- 最后,新建一个与该用户名一样的用户组,也就是说当创建用户john的时候,也同时创建了一个叫john的用户组,而用户john默认属于john用户组。
这里对/etc/skel目录做一些说明。
系统在添加用户时,需要预先为这个用户创建一些默认的“配置文件”,而默认配置的就是/etc/skel目录下的几个隐藏文件。可以说,/etc/skel实际上是创建用户时的“模板”。
[root@localhost skel]# useradd -u 555 user1
创建用户user2时,指定了该用户所属的Group是user1。
[root@localhost skel]# useradd -g user1 user2
d参数指定该用户的家目录,而不是使用系统默认创建的家目录
[root@localhost skel]# useradd -d /home/mydir3 user3
创建用户后,该用户实际上还没有登录系统的权限,因为在不设置密码的情况下,在/etc/shadow中该用户记录中以冒号分隔的第二列将显示为两个感叹号“!!”,这说明不允许该用户登录系统。
因此,需要同时设置用户的密码才行,设置命令是passwd后接用户名
//之后root用户才能执行
[root@localhost skel]# passwd john
Changing password for user john.
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
# 添加用户设置密码
[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.
# 修改家目录为/home/alice_new
[root@localhost ~]# usermod -d /home/alice_new -m alice
# m参数的作用是,如果指定用户的家目录存在, 就自动创建新目录/home/alice_new,并使用该目录作为alice的新家目录。
[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:::
# 解冻
[root@localhost ~]# usermod -U alice
[root@localhost ~]# cat /etc/shadow | grep alice
alice:$1$Doi70VUY$Gmjq6HijgNLsm7xnys4Lw/:15642:0:99999:7:::
[root@localhost ~]# userdel alice
默认情况下,删除用户时并不会删除原来用户的家目录和邮件信息。可以使用-r参数同时删除用户家目录和该用户的邮件。
在添加用户的时候系统默认会创建一个与用户名一样的用户组。
其实也可以直接创建用户组,新增用户组的命令是:
groupadd 用户组名称
在Linux中,使用/etc/group文件来记录用户组。如下:增加一个group1组:
[root@localhost ~]# groupadd group1
[root@localhost ~]# cat /etc/group
......(略去内容)......
group1:x:503:
在/etc/group文件中,每一行就代表一个用户组,其格式是使用3个分隔号“:”隔开的4列。
- 第一列是用户组名
- 第二列代表密码(但是并不使用)
- 第三列代表用户组的数字ID
- 第四列是组成员,这里为空说明还没有任何用户属于这个组
这里需要注意的是,如果已有用户属于这个试图删除的组,该操作会失败。
groupdel命令的使用方式如下:
[root@localhost ~]# groupdel group1
Linux会把所有来自不同终端的活动定义为一个会话,从who命令的输出,可以看出lianggao用户是通过不同的终端登录到系统中的。
如下所示:
LiangdeMacBook-Pro:HDFS3 lianggao$ who
lianggao console 5 28 11:04
lianggao ttys000 5 28 11:21
lianggao ttys001 5 29 15:49
命令显示的结果有3列
- 第一列是登录用户的用户名
- 第二列是用户登录的终端
- 第三列是用户登录的时间
w命令
LiangdeMacBook-Pro:HDFS3 lianggao$ w
17:47 up 1 day, 6:44, 3 users, load averages: 2.69 3.12 3.06
登录用户名 登录终端 从哪里登录 登录时间 空闲时间
USER TTY FROM LOGIN@ IDLE WHAT
lianggao console - 日11 30:43 -
lianggao s000 - 日11 30:19 vim
lianggao s001 - 15:49 - w
第三列:如果用户从网络登录,则显示远程主机的主机名或IP地址。
w命令的第一行会显示当前时间、系统运行时间、已登录的用户数量和系统负载。