7.1 用户和组账号概述
Linux 系统是一个多用户多任务的操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问;另一方面也可以帮助用户管理文件,并为用户提供安全性保护。
7.1.1 用户账号
根据帐号位置分为:
本地用户(UID:1000+):在服务器该操作系统上创建的用户;
远程(域)用户:典型的例子为 LDAP(轻量目录访问协议)远程用户。
根据帐号功能分为:
超级用户 root:UID为 0,对本主机拥有所有权限;
程序用户:UID为 1~499, 一般不允许登录到系统,仅用于维持系统或程序的正常运行;
普通用户:UID为 500~60000):一般只有在用户自己的宿主目录中有完全权限。
7.1.2 组账号
基于某种特定联系将多个用户集合在一起,构成一个用户组,用于表示该组内所有用户的账号称为组账号。每个用户至少属于一个组,这个组称为该用户的基本组(或私有组);如果该用户同时还包括在其他的组中,则这些组称为该用户的附加组(或公有组)。
7.1.3 UID 和 GID 号
linux系统中的每个用户账号都有一个数字形式的身份标记,称为 UID,对于系统核心来说,UID作为区分用户的基本依据,原则上每个用户的 UID号应该是唯一的root用户账号的 UID号为固定值 0,而程序用户账号的 UID号在 1-499之间,500-60000的 UID号默认
分配给普通用户账号使用*。*
与 UID 类似,每一个组账号也有一个数字形式的身份标记,称为 GID,root 组账号的
GID号为固定值 O,而程序组账号的 GID号默认在 1-499之间,普通组账号使用的 UID号默认为 500~60000。
7.2 用户和组配置文件
7.2.1 用户信息文件:/etc/passwd
文件格式及字段简单说明如下:
7.2.2 用户密码文件:/etc/shadow
7.2.3 用户组文件:/etc/group
文件格式及字段简单说明如下:
7.2.4 用户组密码文件:/etc/gshadow
7.2.5 用户家目录:/home
创建一个用户就会在这个目录下创建一个以该用户名称命名的目录,该目录下有用户
的配置文件。
7.2.6 用户邮件目录:/var/spool/mail/
[root@ezsvs mail]# pwd 【查看当前路径】
/var/spool/mail
[root@ezsvs mail]# ls 【查看邮件目录下有哪些用户的邮件】
ezsvs max rpc
[root@ezsvs mail]# cat ezsvs 【查看 ezsvs用户的邮件信息】
如果 ezsvs有邮件,那么就会显示邮件的内容,如果没有邮件,则无任何输出结果。
7.3 管理用户和组
7.3.1 id
id命令可以显示真实有效的用户 ID(UID)和组 ID(GID),UID 是对一个用户的单一身份标识,组 ID(GID)则对应多个 UID。id命令已经默认预装在大多数 Linux系统中,要使用它,只需要在你的控制台输入 id,不带选项输入 id会显示如下。当我们想知道某个用户的UID和 GID时 id命令是非常有用的。一些程序可能需要 UID/GID来运行。id使我们更加容易地找出用户的 UID以 GID而不必在/etc/group文件中搜寻。
例:查看 max用户的详细信息。
[root@ezsvs ~]# id max 【显示 max用户信息】
uid=1002(max) gid=1000(max) 组=1000(max)
[root@ezsvs ~]# id Linux 【如果用户不存在则会提示没有该用户】
id: Linux: no such user
7.3.2 useradd
useradd命令用于 Linux中创建的新的系统用户。帐号建好之后,再用 passwd 设定帐号的密码。使用 use客户 dd指令所建立的帐号,实际上是保存在/etc/passwd文本文件中。
-c:添加描述信息;
-d:家目录;默认在/home以该用户名命名的目录;
-g:所属组;指定时,GID必须事先存在,否则无法创建成功;
-G:附属组;
-s:环境变量;只有/bin/bash和/sbin/nologin两种;
-u:指定 UID。
例:创建 ezsvs用户,描述为 thisisadmin,家目录为/home,UID为 2016,所属组为
ezsvs,附属组为 ezsvs,登录 shell环境变量为/sbin/noligin。
[root@ezsvs ~]# useradd -c thisisadmin -d /home -u 2016 -g ezsvs -G ezsvs
-d /home/ -s /sbin/nologin ezsvs
useradd:警告:此主目录已经存在。不从 skel 目录里向其中复制任何文件。
[root@ezsvs ~]# id ezsvs 【查看用户信息】
uid=2016(ezsvs) gid=1001(ezsvs) 组=1001(ezsvs)
7.3.3 userdel
userdel命令用于删除给定的用户,以及与用户相关的文件。若不加选项-r,则仅删除
用户帐号,而不删除相关文件。
例:删除 ezsvs用户。
[root@ezsvs ~]# userdel -r ezsvs 【删除 ezsvs 用户,如果不使用-r 参数,有的关于 ezsvs用户的一些文件依然存在】
userdel:/home/ 并不属于 ezsvs,所以不会删除
[root@ezsvs ~]# id ezsvs 【查看用户 ezsvs信息】
id: ezsvs: no such user
7.3.4 usermod
usermod命令用于修改用户的基本信息,usermod命令不允许你改变正在线上的使用者帐号名称。当 usermod命令用来改变 user id,必须确认这名 user没在电脑上执行任何程序。
例:将 max用户的 UID改成 1002。
[root@ezsvs ~]# id max 【查看 max用户信息】
uid=1000(max) gid=1000(max) 组=1000(max) 【UID为 1000】
[root@ezsvs ~]# usermod -u 1002 max 【将 max 用户的 UID 改为 1002】
[root@ezsvs ~]# id max
uid=1002(max) gid=1000(max) 组=1000(max) 【UID被改成了 1002】
7.3.5 passwd
用于设置用户的认证信息,包括用户密码、密码过期时间等。系统管理者则能用它管理
系统用户的密码。只有管理者可以指定用户名称,一般用户只能变更自己的密码。常见选项
如下:
-d:删除密码;
-l:暂时锁定用户密码;
-u:解锁用户密码。
例:给 max用户设置密码。
[root@ezsvs ~]# passwd max
更改用户 max 的密码 。
新的密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
7.3.6 chage
来修改帐号和密码的有效期限。常见选项如下:
-m:密码可更改的最小天数。为零时代表任何时候都可以更改密码;
-M:密码保持有效的最大天数;
-w:用户密码到期前,提前收到警告信息的天数;
-E:帐号到期的日期。过了这天,此帐号将不可用;
-d:上一次更改的日期;
-i:停滞时期。如果一个密码已过期这些天,那么此帐号将不可用;
-l:例出当前的设置。由非特权用户来确定他们的密码或帐号何时过期。
例:设置 max用户密码老化时间为 0。
[root@ezsvs ~]# chage -d 0 max
7.3.7 groupadd
用于创建一个新的工作组,新工作组的信息将被添加到系统文件中。
例:新建一个 Linux组。
[root@ezsvs ~]# groupadd Linux
[root@ezsvs ~]# cat /etc/group | grep Linux
Linux❌1002:
7.3.8 groupdel
用于删除指定的工作组,本命令要修改的系统文件包括/ect/group 和/ect/gshadow。若该群组中仍包括某些用户,则必须先删除这些用户后,方能删除群组。
例:将 Linux组删除。
[root@ezsvs ~]# groupdel Linux 【删除 Linux组】
[root@ezsvs ~]# cat /etc/group | grep Linux
[root@ezsvs ~]# 【此时已经没有 Linux组了】
7.3.9 groupmod
更改群组识别码或名称。需要更改群组的识别码或名称时,可用 groupmod指令来完成这项工作。
例:将 Linux组的组 ID改成 2000。
[root@ezsvs ~]# groupmod -g 2000 Linux 【将 Linux组 ID改成 2000】
[root@ezsvs ~]# cat /etc/group | grep Linux
Linux:x:2000: 【组 ID号被改成了 2000】
7.3.10 newgrp
用于转换组,即转换用户的当前组到指定的组账户。
例:创建 fan和 lin两个用户,给 fan用户组设置密码,将 lin用户加入到 fan组中。
[root@ezsvs ~]# use客户 dd fan 【创建用户 fan】
[root@ezsvs ~]# use客户 dd lin 【创建用户 lin】
[root@ezsvs ~]# gpasswd fan 【配置 fan用户的密码】
正在修改 fan 组的密码
新密码:
请重新输入新密码:
[root@ezsvs ~]# su – lin 【切换到 lin用户】
[lin@ezsvs ~]$ newgrp fan lin 【lin用户加入到 fan组】
密码: 【输入 fan组的密码】
[lin@ezsvs ~]$ exit
exit
7.3.11 gpasswd
gpasswd命令是 Linux下工作组文件/etc/group和/etc/gshadow管理工具。常见选项如下:
-a:添加用户到组;
-d:从组删除用户;
-A:指定管理员;
-M:指定组成员和-A的用途差不多;
-r:删除密码;
-R:限制用户登入组,只有组中的成员才可以用 newgrp加入该组。
例:取消 max用户为 Linux组管理员,可以设定组管理员为空
[root@ezsvs ~]# gpasswd -A max Linux 【设定 max 用户为 Linux 组的管理员】
7.3.12 users
用于显示当前登录系统的所有用户的用户列表。每个显示的用户名对应一个登录会话。
如果一个用户有不止一个登录会话,那他的用户名将显示相同的次数。
[root@ezsvs ~]# users
(unknown) root root root
7.3.13 groups
在标准输入输出上输出指定用户所在组的组成员,每个用户属于/etc/passwd中指定的一个组和在/etc/group中指定的其他组。
例:查看系统中有哪些组。
[root@ezsvs ~]# groups
root max Linux
7.3.14 su
用于切换当前用户身份到其他用户身份,变更时须输入所要变更的用户帐号与密码。
例:切换到 max用户。
[root@ezsvs ~]# su – max 【切换到 max用户】
上一次登录:一 5月 16 11:48:58 CST 2016pts/0 上
[max@ezsvs ~]$ su – root 【切换回到 root用户,需要密码】
密码:
上一次登录:一 5月 16 15:18:40 CST 2016从 192.168.136.1pts/0 上
备注:root用户可以无密码登录普通用户;普通用户登录 root必须有 root的密码
7.3.15 ac
显示用户在线时间的统计信息。
[root@ezsvs ~]# ac 【显示用户在线时间】
total 461.02
[root@ezsvs ~]# ac -p 【显示所有用户的登录时间】
root 388.60
(unknown) 72.43
total 461.03
[root@ezsvs ~]# ac -d -y -p root 【显示 root用户所有的登录时间】
root 0.26
May 5 2016 total 0.26
root 38.35
May 9 2016 total 38.35
root 74.10
May 10 2016 total 74.10
root 59.92
May 11 2016 total 59.92
root 96.00
May 13 2016 total 96.00
root 120.01
Today total 120.01
7.3.16 lastlog
用于显示系统中所有用户最近一次登录信息。 lastlog文件在每次有用户登录时被查询。可以使用 lastlog 命令检查某特定用户上次登录的时间,并格式化输出上次登录日志/var/log/lastlog 的内容。它根据 UID 排序显示登录名、端口号(tty)和上次登录时间。如果一个用户从未登录过,lastlog显示Never logged。注意需要以 root身份运行该命令。
[root@ezsvs ~]# lastlog
用户名 端口 来自 最后登陆时间
root pts/1 192.168.136.1 一 5月 16 11:10:24 +0800 2016
max pts/0 一 5月 16 11:48:58 +0800 2016
**
7.4 权限管理**
7.4.1 用户权限介绍
文件属性的九个字符,分为三个组,被称为文件模式,并注明读(r)、写(w)、和执行(x)权限授予文件的所有者、文件的所有组、和其它的用户。同文件上的读取权限允许文件被打开和读取一样,如果目录同时有执行限时,就允许其目录内容被列出。此外,如果一个文件有执行权限,就允许它作为一个程序运行。
例:查看/root目录下各个文件及目录的权限。
[root@ezsvs ~]# ll 【列出该目录下的文件及目录信息】
总用量 28
drwxr-xr-x. 2 root root 6 6月 13 17:51 aaa 【最前面有 d,表示目录】
-rw-------. 1 root root 1430 5月 5 18:15 anaconda-ks.cfg
-rw-r--r--. 1 root root 220 6月 14 10:45 err.log
-rw-r--r--. 1 root root 100 6月 14 10:41 max.txt
-rwxr-xr-x. 1 root root 65 6月 15 10:14 guidang.sh 【有 x表示具有执行权限】
7.4.2 用户的三种权限
权限 权限字母表达 权限数字表达
读 r 4
写 w 2
执行 x 1
7.4.3 三类用户
u: 属主,即文件或目录的所有者;
g: 属组,即和文件属主有相同组 ID的所有用户;
o: 其它用户,即来宾用户;
a表示所有用户。
7.4.4 用户权限管理命令
chown: 改变文件属主(只有管理员可以使用此命令;
例:首先创建 test.txt文件,然后更改文件的所有者为 max,所属组为 ezsvs。
[root@ezsvs ~]# touch test.txt 【创建 test.txt文件】
[root@ezsvs ~]# ll | grep test.txt 【列出 test.txt 详细信息】
-rw-r--r--. 1 root root 0 5月 16 16:01 test.txt【所有者和所属组都是 root】
[root@ezsvs ~]# chown max:ezsvs test.txt 【将 test.txt文件的所有者改为 max,所属组改为 ezsvs(中间的:可以使用.代替)】
[root@ezsvs ~]# ll | grep test.txt 【列出 test.txt 详细信息】
-rw-r--r--. 1 max ezsvs 0 5月 16 16:01 test.txt【test.txt 文件的所有者被改成了 max,所属组被改成了ezsvs】
(2)chgrp:设置文件的属组信息;例:将 test.txt文件的所属组改为 max。
[root@ezsvs ~]# ll | grep test.txt 【列出 test.txt详细信息】
-rw-r--r--. 1 max ezsvs 0 5月 16 16:01 test.txt 【test.txt 文件的所属组为 ezsvs】
[root@ezsvs ~]# chgrp max test.txt 【将 test.txt文件的所属组改成 max】
[root@ezsvs ~]# ll | grep test.txt 【列出 test.txt详细信息】
-rw-r--r--. 1 max max 0 5月 16 16:01 test.txt 【test.txt 文件的所属组被改成了 max】
(3)chmod: 修改文件的权限;
例:设置 test.txt文件任何人都不具有执行权限。
[
root@ezsvs ~]# chmod u-x test.txt 【设置 test.txt文件的所有者不具有执行权限】
[root@ezsvs ~]# ll | grep test.txt 【列出 test.txt详细信息】
-rw-rwxrwx. 1 max max 0 5月 16 16:01 test.txt 【权限为 677,test.txt文件的所有者不具有执行权限】
[root@ezsvs ~]# chmod a-x test.txt 【设置 test.txt文件的任何人都不具有执行权限】
[root@ezsvs ~]# ll | grep test.txt 【列出 test.txt详细信息】
-rw-rw-rw-. 1 max max 0 5月 16 16:01 test.txt 【权限为 666,无执行权限】
7.4.5 特殊权限
(1)SUID
: 运行某程序时,相应进程的属主是程序文件自身的属主,而不是启动者;即当在一个二进制文件上启用了 suid 后,那么任何人在执行该命令时拥有该命令拥有人权限,只能应用在可执行文件上 suid 只能用在命令上 u+s 就是使普通用户不具有的权限具有了命令权限。我们以 mkdir为例,给 mkdir赋予 u+s权限并验证。
[root@ezsvs ~]# su – shan 【切换到 shan用户】
[shan@ezsvs ~]$ newgrp shui 【将 shan用户加入到 shui组】
密码:
[shan@ezsvs ~]$ exit 【退出】
exit
[shan@ezsvs ~]$ exit
登出
[root@ezsvs ~]# su – shui 【切换用户到 fan】
[shui@ezsvs ~]$ cd /
[shui@ezsvs /]$ mkdir aaa 【在/目录下创建目录,但是提示权限不够】
mkdir: 无法创建目录"aaa": 权限不够
[fan@ezsvs /]$ exit
登出
[root@ezsvs ~]# chmod u+s /bin/mkdir 【给 mkdir命令赋予 u+s权限】
[root@ezsvs ~]# ll /bin/mkdir
-rwsr-xr-x. 1 root root 79712 1月 25 2014 /bin/mkdir 【权限出现 s权限】
[root@ezsvs ~]# su – shui
上一次登录:一 5月 16 16:36:44 CST 2016pts/0 上
[shui@ezsvs ~]$ cd /
[shui@ezsvs /]$ mkdir aaa【用 fan用户在/目录下创建目录,没有报错了,这就是 u+s的作用】
[shui@ezsvs /]$ ll | grep aaa
drwxrwxr-x. 2 root fan 6 5月 16 16:37 aaa
备注:默认情况下只有 passwd这个命令有 u+s权限
[root@ezsvs ~]# ll /bin/passwd
-rwsr-xr-x. 1 root root 27832 1月 30 2014 /bin/passwd 【passwd 命令默认就有 u+s权限】
(2)SGID
: 运行某程序时,相应进程的属组是程序文件自身的属组,而不是启动者所属的基本组;
当在一个二进制文件上启用了 sgid 后,那么任何人在执行该命令时临时拥有命令拥有的组权限,只能应用在可执行文件上;如果在一个目录上应用了 sgid 后,那么任何人在该目录创建文件/目录的拥有组会继承目录本身的组。在没有给定 g+s时,一个用户创建的目录,切换到该目录下创建文件时所属组是创建那个组。例:给定 cc这个目录 g+s权限,无论哪一个用户在 cc下创建目录或者文件所属组都是指定的 lin组。
[root@ezsvs tmp]# mkdir cc;chmod 777 cc 【创建一个目录,让所有人都具有读写执行权限】
[root@ezsvs tmp]# ll
总用量 0
drwxrwxrwx. 2 root root 6 5月 16 17:09 cc
[root@ezsvs tmp]# use客户 dd ezsvs 【创建用户】
[root@ezsvs tmp]# use客户 dd shan
[root@ezsvs tmp]# su ezsvs 【切换用户到 ezsvs】
[ezsvs@ezsvs tmp]$ cd cc 【进入到 cc目录下】
[ezsvs@ezsvs cc]$ touch 123 【创建一个文件】
[ezsvs@ezsvs cc]$ ll
总用量 0
-rw-rw-r--. 1 ezsvs ezsvs 0 5月 16 17:09 123 【所属组是 ezsvs,因为是在
ezsvs用户环境下创建的】
[ezsvs@ezsvs cc]$ exit
exit
[root@ezsvs tmp]# chgrp shan cc 【在 root用户下将 cc目录的所属组改成 lin用户】
[root@ezsvs tmp]# ll
总用量 0
drwxrwxrwx. 2 root lin 16 5月 16 17:09 cc
[root@ezsvs tmp]# su ezsvs
[ezsvs@ezsvs tmp]$ cd cc
[ezsvs@ezsvs cc]$ mkdir 456
[ezsvs@ezsvs cc]$ ll
总用量 0
-rw-rw-r--. 1 ezsvs ezsvs 0 5月 16 17:09 123
drwxrwxr-x. 2 ezsvs ezsvs 6 5月 16 17:10 456 【用 ezsvs用户在 cc目录下创建目录或文件的所属组依然是 ezsvs】
下面就给定 cc 这个目录 g+s 权限。无论哪一个用户在 cc 下创建目录或者文件所属组都是指定的 shan组
[ezsvs@ezsvs cc]$ exit
exit
[root@ezsvs tmp]# ll
总用量 0
drwxrwxrwx. 3 root shan 26 5月 16 17:10 cc
[root@ezsvs tmp]# chmod g+s cc 【给 g+s权限】
[root@ezsvs tmp]# ll
总用量 0
drwxrwsrwx. 3 root shan 26 5月 16 17:10 cc 【权限多出一个 s】
[root@ezsvs tmp]# su ezsvs 【切换用户到 ezsvs】
[ezsvs@ezsvs tmp]$ cd cc [ezsvs@ezsvs cc]$ touch 345 [ezsvs@ezsvs cc]$ mkdir 789 [ezsvs@ezsvs cc]$ ll
总用量 0
-rw-rw-r--. 1 ezsvs ezsvs 0 5月 16 17:09 123
-rw-rw-r--. 1 ezsvs shan 0 5月 16 17:16 345 【所属组是 shan】
drwxrwxr-x. 2 ezsvs ezsvs 6 5月 16 17:10 456
drwxrwsr-x. 2 ezsvs shan 6 5月 16 17:16 789 【所属组是 shan】
这样不管是谁在 cc目录下创建文件或目录所属组始终是 shan用户
(3)Sticky
: 在一个公共目录,每个都可以创建文件,删除自己的文件,但不能删除别人的文件。
chmod o+t DIR
chmod o-t DIR
7.5 umask:遮罩
umask设置了用户创建文件的默认权限,它与 chmod的效果刚好相反,umask设置的是权限“补码”,而 chmod设置的是文件权限码。默认情况下文件的最大权限是 666,目录的最大权限是 777,umaks为 022,所对应的文和目录创建缺省权限分别为 644和 755,即我们创建一个文件默认的权限为 644,创建一个目录默认的权限755。
[root@ezsvs ~]# umask 【查看 umask】
0022
[root@ezsvs ~]# touch aaa.txt
[root@ezsvs ~]# mkdir aaa
[root@ezsvs ~]# ll | grep aaa
drwxr-xr-x. 2 root root 6 5月 16 17:02 aaa 【权限为 755】
-rw-r--r--. 1 root root 0 5月 16 17:00 aaa.txt 【权限为 644】
如果我们自己设置一个 umask,那么创建文件目录时的默认权限就会发生变化。例:设置 umask为 002并验证。
[root@ezsvs ~]# umask 002 【设置遮罩为 002】
[root@ezsvs ~]# umask
0002
[root@ezsvs ~]# touch bbb.txt
[root@ezsvs ~]# mkdir bbb
[root@ezsvs ~]# ll | grep bbb
drwxrwxr-x. 2 root root 6 5月 16 17:03 bbb 【权限为 775】
-rw-rw-r--. 1 root root 0 5月 16 17:03 bbb.txt 【权限为 664】