Linux 笔记 - 第五章 Linux 用户与用户组管理
Linux 是一个多用户的操作系统,在日常的使用中,从安全角度考虑,应该尽量避免直接使用 root 用户登录,而使用普通用户。
1. 关于用户 user 的两个重要的文件: /etc/passwd(存储用户信息) 和 /etc/shadow(存储用户对应的密码信息)
[root@ryan ~]# 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
……
/etc/passwd 由 ":" 分割成7个字段:
第一个字段是用户名。
第二个字段是密码的占位符"x"。
第三个字段是用户标识号,也被称为 uid,系统通过这个数字来识别用户身份,此处的"0"就是root,是超级用户的标识号,1~499由系统保留,作为管理账号,普通用户的标识号从500开始,自己定义的普通用户,标识号都是大于或等于500的。
第四个字段是组标识号,也被称为 gid,对应着 /etc/passwd 中的一条记录。
第五个字段是注释说明,没有实际意义。
第六个字段是用户的家目录,root 的家目录是 /root,普通用户的家目录是 /home/[username],也可以自定义用户家目录。
第七个字段是用户的 shell,用户登录后需要启动一个进程,用来将用户输入的命令传送给系统内核,这就是 shell,RedHad/CentOS 的 shell 默认是bash。若想要更改系统创建用户时的默认shell,可以在修改此文件中 /etc/default/useradd 中 SHELL 一行,比如:SHELL=/bin/bash,修改此处。
/etc/shadow 由 ":" 分割成9个字段:
root:$6$zmDSSdDBtTzEFjX1$U65Mlsw17RNnZ06UTtySSvOk725oFk7JEnWj3PjPZdnnVVKlDTYSD34ggqwFp.53E9MoAvfZlsr6DahX6jPsN0:17481:0:99999:7:::
bin:*:15980:0:99999:7:::
daemon:*:15980:0:99999:7:::
adm:*:15980:0:99999:7:::
lp:*:15980:0:99999:7:::
sync:*:15980:0:99999:7:::
shutdown:*:15980:0:99999:7:::
……
第一个字段是用户名,与 /etc/passwd 对应。
第二个字段是用户密码,并且已经加密,如果该用户没有设置密码时,此处将显示两个感叹号"!!"。
第三个字段是上次更改密码的日期,单位为天,从1970年1月1日起到上次更改密码的日期之差,计算天数得到。
第四个字段是要过多少天才可以更改密码,默认是 0,表示不受限制。
第五个字段是密码多少天后到期,即在多少天内必须更改密码,默认是99999,可以理解为不受限制。
第六个字段是密码到期前的警告期限。
第七个字段是账号失效期限,失效后账号会被锁定。
第八个字段是账号的生命周期,到期后账号会作废。
第九个字段是保留字段,目前还没有具体意义。
2. 关于组 group 的两个重要的文件: /etc/group(存储组信息) 和 /etc/gshadow(存储组对应的密码信息,一般组很少设置密码,故很少用)
[root@ryan ~]# 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
……
以上格式为:组名:口令:组标识号:组内用户列表。
具体解释:
组名:组名是用户组的名称,由字母或数字构成。与 /etc/passwd 中的登录名一样,组名不应重复。
口令:口令字段存放的是用户组加密后的口令字。一般 Linux 系统的用户组都没有口令,即这个字段一般为空,或者是*。
组标识号:组标识号与用户标识号类似,也是一个整数,被系统内部用来标识组,即 GID。
组内用户列表:是属于这个组的所有用户的列表,不同用户之间用逗号(,)分隔。这个用户组可能是用户的主组,也可能是附加组。
[root@ryan ~]# cat /etc/gshadow
root:::
bin:::bin,daemon
daemon:::bin,daemon
sys:::bin,adm
adm:::adm,daemon
tty:::
disk:::
lp:::daemon
……
3. 命令 id
id - print real and effective user and group IDs,打印用户和组信息,包括 uid,gid 和所属 groups。
[root@ryan ~]# id root
uid=0(root) gid=0(root) groups=0(root)
注意:
Linux 系统以组 Group 方式管理用户,用户和组的对应关系为多对多,即某个用户可加入/属于一个或多个组,某个组可以有0个、1个或多个用户。从用户的角度,组可以分为主组和附属组。
主组:也被称为 Primary group、first group 或 initial login group,用户的默认组,用户的 gid 所标识的组。
附属组:也被称为 Secondary group或 supplementary group,用户的附加组。
可以通过 id 命令可查看当前用户的主组和附属组,比如:
[root@ryan ~]# id root
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)
[root@ryan ~]# id gg
uid=503(gg) gid=503(gg) groups=503(gg)
[root@ryan ~]# id mm
uid=502(mm) gid=500(jww) groups=500(jww)
其中,gid 标识主组,groups 表示用户所属的全部组(主组和附属组),用户必须有且只能有一个主组,可以有0个、1个或多个附属组。
用户和用户组管理
4. 命令 groupadd
groupadd - create a new group,新增用户组,格式为"groupadd [-g GID] groupname",不加参数 -g 选项,则系统会按照默认的 gid 创建组,和 uid 一样,gid 也是从500开始的。
[root@ryan ~]# groupadd pbwm
[root@ryan ~]# 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
slocate:x:21:
pbwm:x:500:
……
5. 命令 groupdel
groupdel - delete a group,用于删除用户组,只有当用户组中不再包含具体的用户时,才可以删除此空组,否则会提示由于包含某个用户而无法删除。
[root@ryan ~]# groupdel pbwm
groupdel: cannot remove the primary group of user 'adam'
6. 命令 groupmod
groupmod - modify a group definition on the system,用于修改用户组,格式为:"groupmod [-g GID] [-o] [-n] groupname"。
7. 命令 useradd
useradd - create a new user or update default new user information,用于新增一个用户,也可使用 adduser,功能相同,命令的格式为:"useradd [-u UID] [-g GID] [-d HOME] [-M] [-s]",其中:
-u:表示自定义UID。
-g:表示新增用户时指定用户属于哪个组,后面可以跟组 id,也可以跟组名,-G 表示添加附属组。
-d:表示自定义用户的家目录。
-M:表示不建立家目录。
-s:表示自定义 shell 。
[root@ryan ~]# useradd -g pbwm adam
[root@ryan ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
……
adam:x:500:500::/home/adam:/bin/bash
如果 useradd 不加任何选项,直接跟用户名,则会创建一个跟用户名同名的用户组。
[root@ryan ~]# useradd bob
[root@ryan ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
……
adam:x:500:500::/home/adam:/bin/bash
bob:x:501:501::/home/bob:/bin/bash
[root@ryan ~]# cat /etc/group
root:x:0:
bin:x:1:bin,daemon
……
pbwm:x:500:
bob:x:501:
8. 命令 userdel
userdel - delete a user account and related files,用于删除一个用户,命令格式为:"userdel [-r] username",其中 -r 选项表示,当删除用户时一并删除该用户的家目录。
[root@ryan ~]# userdel -r bob
[root@ryan ~]# ll /home
total 4
drwx------. 4 adam pbwm 4096 Dec 17 20:51 adam
9. 命令 usermod
usermod - modify a user account,用于修改一个用户账户信息。
比如修改一个用户的所属组:
# usermod -g 513 user3
比如修改一个用户的附属组,将 username 添加到名称为 secondarygroup 的附属组中:
# usermod -G secondarygroup username
比如修改一个用户的 shell:
# usermod -s /bin/bash user3
10. 命令 chfn
chfn - change your finger information,修改用户的基本信息 finger,finger 其实就是在 /etc/passwd 文件第5个字段中所显示的信息。
[root@ryan ~]# chfn bob
Changing finger information for bob.
Name []: bob-xu
Office []: hsbc
Office Phone []: 1008611
Home Phone []: 1008612
Finger information changed.
[root@ryan ~]# grep bob /etc/passwd
bob:x:501:501:bob-xu,hsbc,1008611,1008612:/home/bob:/bin/bash
用户密码管理
11. 命令 passwd
passwd - update user’s authentication tokens,修改用户的登录密码,格式为 "passwd [username]"。该命令后面若不加用户名字,则是为自己设定密码。如果登录的是 root 账户,后面可以跟普通账户的名字,意思是修改指定账户的密码,只有 root 才可以修改其他账户的密码,普通用户只能修改自己的密码。双敲复合之后令牌被成功更新。
[root@ryan ~]# passwd bob
Changing password for user bob.
New password:
BAD PASSWORD: it is too simplistic/systematic
BAD PASSWORD: is too simple
Retype new password:
passwd: all authentication tokens updated successfully.
12. 命令 mkpasswd
mkpasswd - generate new password, optionally apply it to a user,用于生成密码,包含大小写字母,数字和特殊符。
[root@ryan ~]# mkpasswd
aMg09i(fY
[root@ryan ~]# mkpasswd
j0xRJn5a=
用户身份切换
root 账户提示符是"#",普通用户是"$"。
13. 命令 su
su - run a shell with substitute user and group IDs,命令格式为:"su [-] username",普通用户的 su 命令不加 username 时就是切换到 root 用户,需要输入 root 的密码,root 用户同样可以使用 su 命令切换到普通用户,但不需要输入密码。当不加 [-] 时,当前目录没有变化,加上 [-] 时,当前目录为家目录,区别在于是否初始化当前用户的各种环境变量。
[root@ryan ~]# su bob
[bob@ryan root]$ pwd
/root
[bob@ryan root]$ echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[bob@ryan root]$ whoami
bob
[root@ryan ~]# su - bob
[bob@ryan ~]$ pwd
/home/bob
[bob@ryan ~]$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/bob/bin
[bob@ryan ~]$ whoami
bob
14. 命令 sudo
sudo, sudoedit - execute a command as another user,执行 root 才能执行的命令,sudo命令用来以其他身份来执行命令,预设的身份为root。在/etc/sudoers 中设置了可执行sudo指令的用户。若其未经授权的用户企图使用sudo,则会发出警告的邮件给管理员。用户使用sudo时,必须先输入密码,之后有5分钟的有效期限,超过期限则必须重新输入密码。配置sudo必须通过编辑/etc/sudoers文件,而且只有超级用户才可以修改它,还必须使用visudo编辑。之所以使用visudo有两个原因,一是它能够防止两个用户同时修改它;二是它也能进行有限的语法检查。所以,即使只有你一个超级用户,你也最好用visudo来检查一下语法。visudo默认的是在vi里打开配置文件,用vi来修改文件。
[root@ryan ~]# su bob
[bob@ryan root]$ pwd
/root
[bob@ryan root]$ ls
ls: cannot open directory .: Permission denied
[bob@ryan root]$ echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[bob@ryan root]$ sudo ls
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
[sudo] password for bob:
bob is not in the sudoers file. This incident will be reported.
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
bob ALL=(ALL) ALL
[root@ryan ~]# su bob
[bob@ryan root]$ pwd
/root
[bob@ryan root]$ ls
ls: cannot open directory .: Permission denied
[bob@ryan root]$ sudo ls
[sudo] password for bob:
anaconda-ks.cfg Documents install.log linux Pictures Templates
Desktop Downloads install.log.syslog Music Public Videos
扩展权限 ACL
以上属于基本权限的范畴,此外还有扩展权限 ACL(Access Control List),ACL 权限是为了防止权限不够用的情况,一般的权限有所有者、所属组、其他人这三种,当这三种满足不了我们的需求的时候就可以使用ACL权限。
比如:一个网络老师,给一个班的学员上课,他在linux的根目录下面建立了一个文件,只允许本班级的学员对该目录进行上传下载,其他人都不行,这时该目录的权限一般是770(一般我们设置权限都是所有者的权限大于所属组的权限,所属组的权限大于其他人的权限,依次往下),此时有个同学想试听我们的课程,该怎么给他分配权限呢?此时的所属组、所有者、其他人都不满足,这时就要用到 ACL 权限,ACL 权限的原理类似 Windows 给一个文件添加用户(这个用户对该文件具有的权限)。
设置 ACL 权限:
设置用户:setfacl -m u:user1:rx test [u表示设置用户的 ACL,user1为具体的用户,rx 为要设置的权限,test 为目录或者文件]
设置组:setfacl -m g:group1:rx test [g表示设置组的 ACL,group1为具体的组,rx 为要设置的权限,test 为目录或者文件]
其中的选项 -m 表示修改ACL,你可以增加新的,或修改存在的ACL。
查看 ACL 权限:
getfacl test,用于显示分配完的 ACL 权限。
[root@ryan linux]# getfacl test
# file: test
# owner: root
# group: root
user::rwx
group::r-x
other::r-x [root@ryan linux]# setfacl -m u:adam:rx test
[root@ryan linux]# setfacl -m g:pbwm:rx test
[root@ryan linux]# getfacl test
# file: test
# owner: root
# group: root
user::rwx
user:adam:r-x
group::r-x
group:pbwm:r-x
mask::r-x
other::r-x
可以看到添加了一个 adam 用户和一个 pbwm 组,这两个就是通过设置 ACL 权限做到的。
[root@ryan linux]# ll -d test
drwxr-xr-x+ root root Dec : test
如上,设置 ACL 权限后,权限后会多一个 + 标记,这表示ACL已经设置成功。
删除 ACL 权限:
删除ACL用户权限:setfacl -x u:user1 test
删除ACL组权限:setfacl -x g:group1 test
删除整个ACL权限:setfacl -b test
附录
Linux 笔记 - 第五章 Linux 用户与用户组管理的更多相关文章
- Linux基础学习(7)--用户和用户组管理
第七章——用户和用户组管理 一.用户配置文件 1.用户信息文件/etc/passwd: (1)用户管理简介:所以越是对服务器安全性要求高的服务器,越需要建立合理的用户权限等级制度和服务器操作规范. ...
- Linux 笔记 - 第十三章 Linux 系统日常管理之(二)Linux 防火墙和任务计划
博客地址:http://www.moonxy.com 一.前言 Linux 下的的防火墙功能是非常丰富的,作为 Linux 系统工程师有必要了解一下.防火墙一般分为硬件防火墙和软件防火墙.但是,不管是 ...
- Linux 笔记 - 第十三章 Linux 系统日常管理之(三)Linux 系统日志和服务
博客地址:http://www.moonxy.com 一.前言 日志文件记录了系统每天发生的各种各样的事情,比如监测系统状况.排查问题等.作为系统运维人员可以通过日志来检查错误发生的原因,或者受到攻击 ...
- Linux 笔记 - 第十三章 Linux 系统日常管理之(四)Linux 中 rsync 工具和网络配置
博客地址:http://www.moonxy.com 一.前言 rsync 命令是一个远程数据同步工具,可通过 LAN/WAN 快速同步多台主机间的文件,可以理解为 remote sync(远程同步) ...
- Linux 笔记 - 第十三章 Linux 系统日常管理之(一)系统状态监控
博客地址:http://www.moonxy.com 一.前言 如果你是一名 Linux 运维人员,最主要的工作是优化系统配置,使应用在系统上以最优的状态运行.系统运行状态主要包括:系统负载.内存状态 ...
- Linux 笔记 - 第六章 Linux 磁盘管理
博客地址:http://www.moonxy.com 一.前言 1.1 硬盘 硬盘一般分为 IDE 硬盘.SCSI 硬盘和 SATA 硬盘.在 Linux 中,IDE 接口的设备被称为 hd,SCSI ...
- Linux 笔记 - 第四章 Linux 文件和目录管理
博客地址:http://www.moonxy.com 1. 绝对路径和相对路径 绝对路径:由根目录 "/" 写起的.如:/usr/local/mysql 相对路径:不是由根目录 & ...
- Linux 笔记 - 第十七章 Linux LVM 逻辑卷管理器
一.前言 在实际生产中,有时会遇到磁盘分区空间不足的情况,这时候就需要对磁盘进行扩容,普通情况下需要新加一块磁盘,重分区.格式化.数据复制.卸载旧分区.挂载新分区等繁琐的步骤,而且有可能造成数据的丢失 ...
- 《Linux内核设计与实现》第四周读书笔记——第五章
<Linux内核设计与实现>第四周读书笔记--第五章 20135301张忻 估算学习时间:共1.5小时 读书:1.0 代码:0 作业:0 博客:0.5 实际学习时间:共2.0小时 读书:1 ...
随机推荐
- Android常用库源码解析
图片加载框架比较 共同优点 都对多级缓存.线程池.缓存算法做了处理 自适应程度高,根据系统性能初始化缓存配置.系统信息变更后动态调整策略.比如根据 CPU 核数确定最大并发数,根据可用内存确定内存缓存 ...
- neural_transfer风格迁移
ContentLoss 首先是要定义一个内容差异损失函数,这里直接调用functional.mse_loss(input,self.target)就可以计算出其内容差异损失. 注意这里一般是定义一个网 ...
- 在linux中部署项目并创建shell脚本
1.首先要在idea中父工程maven包下执行clean生成的target包 2.执行package打包,打包时候讲test勾去掉 3.将target包中生成的jar包cp出来 此处注意打包时必须要保 ...
- 如何处理scrum中未完成的用户故事?
你听过柏林新建机场的故事吗?机场原定2006年开工,2007年启用,但由于机场建设过程中到处出现施工和安全问题,补东墙漏西墙,导致工期一拖再拖,预算一涨再涨,以至于2019年了还没开张,预计开业时间已 ...
- 委托和lambda表达式,Action和Func
1.为什么要用委托 我们为什么要有委托?任何东西存在即合理,不合理的也会被时间淘汰掉,委托既然存在肯定有存在的必要,我们来看一下什么时候可以用到委托. 接下来我们有个需求,就是调用一个方法,取出1-1 ...
- 浅谈UART/12C/TTL的定义与区别与解析
UART/12C/TTL的定义与区别: UART:UART(Universal Asynchronous Receive Transmitter):也就是我们经常所说的串口,基本都用于调试.主机和从机 ...
- es6 个人笔记
1.package.json==>npm init node_modules==>npm install webpack -D webpack.config.js==> ...
- idea使用springboot的webservice基于cxf
SpringBoot整合CXF实例: 服务端构建 <dependency> <groupId>org.apache.cxf</groupId> <artifa ...
- 安装VMware Workstation时遇到Microsoft Runtime DLL安装程序未能完成安装
解决:这时不要点确定.开始菜单运行输入‘%temp%’,在弹出的窗体中找到一个文件名中含‘{XXXXXXXXXXXXX}~setup'的文件夹,打开里面会看到有 xxx.msi的,运行就开始vmwar ...
- 【原创】ARMv8 MMU及Linux页表映射
背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...