首页 > 代码库 > Linux系统管理之用户管理

Linux系统管理之用户管理

Linux是个多用户多任务的分时操作系统,所有要使用系统资源的用户都必须先向系统管理员申请一个账号,然后以这个账号的身份进入系统。用户的账号一方面能帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问;另一方面也能帮助用户组织文件,并为用户提供安全性保护。每个用户账号都拥有一个惟一的用户名和用户口令。用户在登录时键入正确的用户名和口令后,才能进入系统和自己的主目录。实现用户账号的管理,要完成的工作主要有如下几个方面:

  • 用户管理,包括用户的添加、删除、修改

  • 用户组的管理,包括用户组的添加,修改删除

  • 密码管理即用户口令管理,包括密码设置、修改密码


一、用户管理

用户的管理主要包括:新增用户、用户相关属性的修改(新的属主、属组、加入附加组)、用户信息清除。

1、创建新用户

创建用户使用命令 useradd 命令,使用adduser也可以,使用adduser其实本质上依然使用的是useradd命令,他们是软连接的关系,本文中统一使用 useradd。

a、useradd 格式及相关参数

格式:
useradd [ options ] 用户名

选项:
-u uid:指定id号
-g Gid:指定基本组
-d  HOME_DIR 指定家目录
-G group1 [,group2,...] 指定附加组 ,配合a使用,保留原始的组信息
-c "CIMMENT" 指定描述信息
-s shell 指定默认shell
-r 创建系统用户 -s nologin
-o 配合-u选项,不检查UID的唯一性 创建同UID的用户,权限相同
-N 不创建石有组做主组,使用users组做主组
-D  修改/etc/default/useradd

例如:新建一个用户python,其ID号为2002,其家目录为/app/python,描述信息为“My name is python”,非交互式方式登录。

[root@centos7 ~]# useradd -u 2002 -c "My name is python" -d /app/python -s /sbin/nologin

之所以在创建用户的时候有诸多选项主要是由和用户相关的配置文件有关,/etc/passwd 配置文件中定义了一个用户的相关属性信息,每个信息之间以冒号“:”分割,共七个字段,分别是:用户名、密码位、UID、GID、描述信息、家目录、使用的 shell 类型。

[root@centos7 ~]# cat /etc/passwd
 root:x:0:0:Superuser:/:
 daemon:x:1:1:System daemons:/etc:
 bin:x:2:2:Owner of system commands:/bin:
 sys:x:3:3:Owner of system files:/usr/sys:
 adm:x:4:4:System accounting:/usr/adm:
 uucp:x:5:5:UUCP administrator:/usr/lib/uucp:
 ...后面的省略...

2.修改用户属性

修改用户账号就是根据实际情况更改用户(chgrp是针对文件而言)的有关属性,如用户号、主目录、用户组、登录Shell等。修改已存在用户的信息使用usermod命令,格式如下:

格式:
usermod [ options ] [ args... ] 用户

选项:
-u 新的属主
-g 新的属组
-aG 附加组,加a保留原来的属组
-s 新的shell
-d home :新的家目录
-c 修改注释信息(chfn)
-l login_name:新的名字,其他信息都不变化
-L lock :指定用户,在/etc/shadow密码栏增加!
-U unlock :指定用户,在/etc/shadow密码栏减少!
-e YYY-MM-DD :指定用户账号过期日期
-f INACTIVE :设定非活动期限

usermod 命令只有超级管理员才能使用,或者通过 sudo 命令授权某个普通用户来使用,没有授权的普通用户是不能使用的该命令的。

实例:

a、将用户的 python 的 shell 类型改为/bin/bash ,家目录改为/home/python,用户组改为tom(tom组已经存在)组。

[root@centos7 ~]# usermod -d /home/python -s /bin/nash -g tom python

b、将用户tom的的主组改为python

[root@centos7 ~]# usermod tom -g python

c、添加python的附加组为 root

[root@centos7 ~]# usermod -aG root python  # -a参数作用为保留原有的组,如果不加-a选项,python的组将变成root

3.删除用户

如果一个用户账号不再使用,便能从系统中删除。删除用户账号就是要将/etc/passwd等系统文件中的该用户记录删除,必要时还要删除用户的主目录。删除一个已有的用户账号使用 userdel 命令,格式如下:

格式:
[root@centos7 ~]# userdel [ options ] 用户名

参数:
-r :删除该用户在/etc/passwd等文件中的条目,并且删除其家目录和邮件目录
-f :强制删除

例如:

[root@centos7 ~]# userdel -r python

此命令删除用户 python 在系统文件(主要是/etc/passwd,/etc/shadow,/etc/group等)中的记录,同时删除用户的主目录(/home/pythony 以及/var/spool/mail/python)。


二、用户组管理

用户组的管理和用户的管理基本相同,只是针对的对象不同罢了,用户管理是针对用户,而用户组管理针对的是用户组。主要操作有:创建用户组、修改用户的用户组、删除一个组。

每个用户都有一个用户组,系统能对一个用户组中的所有用户进行集中管理。不同Linux系统对用户组的规定有所不同,如Linux下的用户属于和他同名的用户组,这个用户组在创建用户时同时创建。用户组的管理涉及用户组的添加、删除和修改。组的增加、删除和修改实际上就对/etc/group文件的更新。

用户组(group)就是具有相同特征的用户(user)的集合体;比如有时我们要让多个用户具有相同的权限,比如查看、修改某一文件或执行某个命令,这时我们需要用户组,我们把用户都定义到同一用户组,我们通过修改文件或目录的权限,让用户组具有一定的操作权限,这样用户组下的用户对该文件或目录都具有相同的权限,这是我们通过定义组和修改文件的权限来实现的;

1.创建用户组

增加用户使用 groupadd 命令。

格式:
groupadd 选项 用户组

选项:
 -g GID 指定新用户组的组标识号(GID)。
 -o 一般和-g选项同时使用,表示新用户组的GID能和系统已有用户组的GID相同。
 -r 创建一个系统组
 
实例:
[root@centos7 ~]# groupadd g1
 此命令向系统中增加了一个新组g1,新组的组标识号是在当前已有的最大组标识号的基础上加1。
 
[root@centos7 ~]# groupadd -g 1001 g2
 此命令向系统中增加了一个新组group2,同时指定新组的组标识号是1001。

2.修改用户组

修改用户组使用 groupmod 命令。

格式:
groupmod 选项 用户组

选项:
 -g GID 为用户组指定新的组标识号。
 -o 和-g选项同时使用,用户组的新GID能和系统已有用户组的GID相同。
 -n 新用户组 将用户组的名字改为新名字
 
实例:
[root@centos7 ~]# groupmod -g 1002 g2  # 此命令将组g2的组标识号修改为102。
[root@centos7 ~]# groupmod -g 10000 -n g3 g2  # 此命令将组g2的标识号改为10000,组名修改为g3。

如果一个用户同时属于多个用户组,那么用户能在用户组之间转换,以便具有其他用户组的权限。用户能在登录后,使用命令newgrp转换到其他用户组(这里的切换是临时切换,当用户退出后,组主还是原来的组)。

[root@centos7 ~]# su - python
[python@centos7 ~]# newgrp g1  # 临时切换主组

这条命令将当前用户转换到 g1 用户组,前提条件是g1用户组确实是该用户的主组或附加组。类似于用户账号的管理,用户组的管理也能通过集成的系统管理工具来完成;如果g1用户组不是该用户的附加组,在切换的时候需要提供密码。

3.删除用户组

删除用户组使用 groupdel 命令,格式如下:

格式:
groupmod 选项 用户组

选项:
 -g GID 为用户组指定新的组标识号。
 -o 和-g选项同时使用,用户组的新GID能和系统已有用户组的GID相同。
 -n 新用户组 将用户组的名字改为新名字
 
实例:
 [root@centos7 ~]# groupmod -g 1002 g2  # 此命令将组g2的组标识号修改为1002。
 [root@centos7 ~]# groupmod -g 10000 -n g3 g2  # 此命令将组g2的标识号改为10000,组名修改为g3

4.与用户组相关的另外两个命令 groupmems 和 groups

groupmems 命令可以管理组类的成员,例如:查看组中的成员,删除组中的成员,清空组成员等;groups 命令主要是查看某用户属于哪个组。例如

#.*.-----------  ------------.*.#
格式:
groupmems  [ ptions ] -g 组名

选项:
-d user :从组中删除指定用户
-l :列出指定组中的用户
-p :清空组成员

实例:
[root@centos7 ~]# groupmems -l -g g1  # 列出g1组中的成员
python tom
[root@centos7 ~]# groupmems -d tom -g g1 # 从组g1中删除用户tom
python
[root@centos7 ~]# groupmems -p -g g1  # 清空g1组中的成员

[root@centos7 ~]#

#.*.-----------  ------------.*.#

[root@centos7 ~]# groups tom  # 查看tom属于那些组,结果发现tom只属于自己,结果为tom
tom
[root@centos7 ~]# groups python # 查看python属于那些组
python g1 g2        # python不经属于自己,还属于g1 、g2 组

三、密码管理

密码管理我们使用 passwd 命令来实现,用法相对简单,下面介绍其用法:

格式:passwd [ options ] user

选项:

  • -l  :锁定用户 加双!!

  • -u :解锁用户

  • -e : 强制用户下次登录修改密码

  • -n days :指定最短使用期限

  • -x maxdays :最大使用期限

  • -w warndays :提前多少天开始警告

  • -i inactivedays :非活动期限

  • --stdin :从标准输入接收用户密码

实例:

host ~ ]#
[ root@localhost ~ ]#passwd python   # 直接改密码,交互式方式
Changing password for user python.
New password:    # 输入新密码
BAD PASSWORD: it is too simplistic/systematic
BAD PASSWORD: is too simple   # 如果密码设置太简单,这里会提示
Retype new password:  # 再次输入密码
passwd: all authentication tokens updated successfully.  # 设置成功提醒
[ root@localhost ~ ]#echo centos | passwd --stdin python # 利用管道非交互式设置密码
Changing password for user python.
passwd: all authentication tokens updated successfully.
[ root@localhost ~ ]#

四、用户与用户组相关的配置文件

1、用户配置文件/etc/passwd,/etc/shadown

(1)用户信息配置文件 /etc/passwd

一个新的用户一旦创建成功,那么该用户信息将添加到文件 /etc/passwd 中,该文件中定义了改用的基本属性。该文件对所有用户都是可读的。

[ root@localhost ~ ]#
[ 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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
...后面省略...
[ root@localhost ~ ]#

该文件从左至右共有 7 个字段,分别是:

用户名:口令:UID:GID:用户描述信息:用户家目录:登录Shell类型
  • 用户名:代表用户账号的字符串。通常长度不超过8个字符,并且由大小写字母和/或数字组成。登录名中不能有冒号等特殊字符,因为冒号在这里是分隔符。用户名以数字、字母或下划线开头。

  • 口令:一些系统中存放着加密后的用户口令,虽然这个字段存放的只是用户口令的加密串,不是明文,不过由于/etc/passwd文件对所有用户都可读,所以这仍是个安全隐患。因此,目前许多Linux系统都使用了shadow技术,把真正的加密后的用户口令字存放到/etc/shadow文件中,而在/etc/passwd文件的口令字段中只存放一个特别的字符,例如“x”。

  • UID:即用户标识号,该字段是一个 0-65535 的整数,系统内部用他来标识用户。一般情况下他和用户名是一一对应的。如果几个用户名对应的用户标 识号是相同的,系统内部将把他们视为同一个用户,不过他们能有不同的口令、不同的主目录及不同的登录Shell等。0是终极用户root的标识号,1~64由系统保留(不同版本的系统,保留数值不一样),系统账号的UID范围为1-499(CentOS 6)或1-999(CentOS 7)。

  • GID:即组标识号,该字段记录的是用户所属的用户组。他对应着/etc/group文件中的一条记录。

  • 描述信息:该字段记录着用户的一些个人情况,例如用户的真实姓名、电话、地址等,这个字段并没有什么实际的用途。在不同的Linux系统中,这个字段的 格式并没有统一。在许多Linux系统中,这个字段存放的是一段任意的注释性描述文字,用做finger命令的输出。

  • 家目录:即用户的起始工作目录,他是用户在登录到系统之后所处的目录。在大多数系统中,各用户的主目录都被组织在同一个特定的目录下,而用 户主目录的名称就是该用户的登录名。各用户对自己的主目录有读、写、执行(搜索)权限,其他用户对此目录的访问权限则根据具体情况设置

  • 登录SHELL: 用户登录后,要启动一个进程,负责将用户的操作传给内核,这个进程是用户登录到系统后运行的命令解释器或某个特定的程式,即Shell。Shell是用户和Linux系统之间的接口。 Linux的Shell 有许多种,每种都有不同的特点。常用的有sh(Bourne Shell),csh(C Shell),ksh(Korn   Shell),tcsh(TENEX/TOPS-20 type C Shell),bash(Bourne Again   Shell)等。系统管理员能根据系统情况和用户习惯为用户指定某个Shell。如果不指定Shell,那么系统使用bash为默认的登录Shell,即这个 字段的值为/bin/bash。

(2)用密码映射文件 /etc/shadown

/etc/shadow中的记录行和/etc/passwd中的一一对应,他由 pwconv 命令根据/etc/passwd中的数据自动产生。他的文件格式和/etc/passwd类似,由若干个字段组成,字段之间用“:”隔开。这些字段是:

登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:保留
  • 登录名:是和/etc/passwd文件中的登录名相一致的用户账号

  • 加密口令:字段存放的是加密后的用户口令字。如果为空,则对应用户没有口令,登录时不必输入口令;如果含有不属于集合{ ./0-9A-Za-z }中的字符,则对应的用户不能登录。

  • 最后一次修改时间:表示的是从某个时刻起,到用户最后一次修改口令时的天数。时间起点对不同的系统可能不相同。通常Linux系统中,这个时间起点是1970年1月1日。

  • 最小时间间隔:指的是两次修改口令之间所需的最小天数。

  • 最大时间间隔:指的是口令保持有效的最大天数。

  • 警告时间:该字段表示的是从系统开始警告用户到用户密码正式失效之间的天数。

  • 不活动时间:表示的是用户没有登录活动但账号仍能保持有效的最大天数,在这段时间里,你可以登录,不过登录时就会让你修改密码。

  • 失效时间:字段给出的是个绝对的天数,如果使用了这个字段,那么就给出相应账号的生存期。期满后,该账号就不再是个合法的账号,也就不能再用来登录了。

2、和用户组相关的文件/etc/group ,/gshadow

(1)用户组信息配置文件:/etc/group

用户组的所有信息都存放在/etc/group文件中。将用户分组是Linux系统中对用户进行管理及控制访问权限的一种手段。每个用户都属于某个用户组;一个组中能有多个用户,一个用户也能属于不同的组。当 一个用户同时是多个组中的成员时,在/etc/passwd文件中记录的是用户所属的主组,也就是登录时所属的默认组,而其他组称为附加组。用户要访问属 于附加组的文件时,必须首先使用 newgrp 命令使自己成为所要访问的组中的成员。用户组的所有信息都存放在 /etc/group 文件中。此文件的格式也 类似于/etc/passwd文件,由冒号隔开若干个字段,这些字段有:

组名:口令:组标识号:组内用户列表
  • 组名:是用户组的名称,由字母或数字构成。和/etc/passwd中的登录名相同,组名不应重复。

  • 组口令:字段存放的是用户组加密后的口令字。一般Linux系统的用户组都没有口令,即这个字段一般为空,或是*。

  • 组标识号:和用户标识号类似,也是个整数,被系统内部用来标识组。

  • 组内用户列表:是属于这个组的所有用户的列表,不同用户之间用逗号“,”分隔。这个用户组可能是用户的主组,也可能是附加组。

实例:

[ root@localhost ~ ]#cat /etc/group
root:x:0:
bin:x:1:bin,daemon
daemon:x:2:bin,daemon
sys:x:3:bin,adm
adm:x:4:adm,daemon
tty:x:5:
disk:x:6:
lp:x:7:daemon
mem:x:8:
...省略...
[ root@localhost ~ ]#

(2)组口令文件 /etc/gshadow

/etc/gshadow文件中主要定义了用户组的密码口令等信息,主要包含:组名:组密码:组id:组成员 4个字段。一般情况下,系统组是不设置密码口令的,即为空。

[ root@localhost ~ ]#cat /etc/gshadow
root:::
bin:::bin,daemon
daemon:::bin,daemon
sys:::bin,adm
adm:::adm,daemon
tty:::
disk:::
lp:::daemon
mem:::
kmem:::
wheel:::
mail:::mail,postfix

谢谢阅读!!

Linux系统管理之用户管理