Linux把权限分为了三类:
查看用户信息:id
1 | id [用户名] # 查看用户的uid, 主组的gid, 所在组信息 |
关于uid:在CentOS 7中,uid=0代表超级管理员;uid在1-999代表虚拟系统用户,其中1-200用于运行系统自带的进程,201-999用于运行安装的程序;uid在1000+,代表普通用户,可以正常登录系统,能进行的操作有限。
查看当前登陆人:who
1 | whoami # 显示当前本人的用户名 |
创建用户:useradd
1 | useradd [用户名] # 每创建一个用户,都会创建一个该用户的主组,以该用户名命名组名,组文件在:/etc/group,组密码文件在:/etc/gshadow |
useradd
的选项
1 | -u # 指定用户的uid |
新建用户后会把用户信息写入/etc/passwd
文件中,这是保存用户信息的文件,具体结构如下:
用户名 :密码占位符 :uid :gid :所在组 :用户家目录 :提供给用户的终端
修改用户信息:usermod
1 | usermod [用户名] # 修改用户的相关信息,必须是已存在的用户,相关选项与useradd的选项相同 |
给用户创建密码:passwd
1 | passwd [用户名] |
创建密码之后会把用户的密码写入/etc/shadow
文件中,这是保存用户密码的文件,具体结构如下:
用户名 : 密码密文 :距离上一次变更过去的天数:更改密码的最少天数 :更改密码的最长天数 :过期提醒天数:预警天数:失效日期:
用户的家目录
每个用户都有自己的家目录:/home/用户名
除了当前目录.
和上级目录..
之外,其他文件均是创建用户时附带的文件,来自于家目录模板:/etc/skel
用户的邮箱文件
每个用户都有自己的邮箱文件:/var/spool/mail/用户名
,用于收发邮件
删除用户:userdel
1 | userdel [用户名] # 会删掉用户的账号和密码以及主组,但是会保留用户的家目录以及邮箱文件 |
1 | userdel -r [用户名] |
创建组:groupadd
1 | groupadd [组名] # 创建一个组 |
修改组:groupmod
1 | groupmod -g [组号] [组名] # 修改组号 |
给组创建密码和修改组成员:gpasswd
1 | gpasswd [组名] # 给组创建密码 |
用户临时进组:newgrp
1 | newgrp [组名] # 当前登录用户,临时获取该组的权限,临时进组需要密码 |
删除组:groupdel
1 | groupdel [组号/组名] # 删除一个组,但是这个组不能是某个用户的主组 |
使用ls -al
查看所有文件的详细信息
下图是文件或目录的详细信息各部分的解释:
档案类型权限的解释
例如:-rw-r--r--
第一个字符代表文件类型,
Linux系统不是以后缀名区分文件类型的,在详细信息中,各种不同的文件类型如下:
1 | 当为[ d ]则是目录,例如上表文件名为“.config”的那一行; |
后面九个字符分为三组,分别代表文件拥有者
,群组
,其他人
所拥有的权限
1 | r代表读权限,w代表修改权限,x代表执行权限 |
而对于文件类型和目录类型,这三种权限又有不同,详细如下:
元件 | 内容 | 叠代物件 | r | w | x |
---|---|---|---|---|---|
文件 | 详细数据data | 文件数据夹 | 读到文件内容 | 修改文件内容 | 执行文件内容 |
目录 | 文件名 | 可分类抽屉 | 读到文件名 | 创建、删除、移动文件,修改文件名 | 进入该目录的权限(key) |
操作某个文件夹下的文件内容,当前用户首先需要具有沿途所有文件夹的执行权限,如果是想要读目标文件,需要具有读权限,如果想要创建、删除、移动目标文件,需要具有写权限。
如果要执行一个二进制的文本文件,只需要执行权限,如果文本文件是shell命令,则还需要读权限,读取shell命令后编译成二进制文件再执行。
改变文件拥有者
1 | chown [账号名称] [文件或目录] # change owner |
1 | chown -R [账号名称:群组名称] [文件或目录] # 同时改变文件拥有者和群组, -R表示递归修改,用于目录的修改。 |
改变文件所属群组
1 | chgrp [-R] [群组名] [文件或目录] # change group ,-R表示递归,用于目录 |
改变文件权限
1 | chmod # change mode |
数字形式改变文件权限
1 | chmod [-R] xyz [文件或目录] # xyz分别代表文件拥有者,群组和其他人的权限 |
字母方式改变文件权限
1 | chmod [-R] u=rwx,go=rx [文件或目录] # u指user,g指代group,o指代others |
1 | chmod [-R] a-x [文件或目录] # a代表三种身份,a-x表示三种身份都拿掉执行权限 |
SUID:Set User ID
给可执行文件的拥有者增加一个SUID
权限,那么当前用户都将以文件拥有者身份操作该可执行文件(前提是需要具有x权限)
1 | chmod u+s [文件名] # 给可执行文件的拥有者增加SUID权限 |
注意:SUID权限仅对可执行文件有效,且仅在执行该文件时有效
SGID:Set Group ID
给文件/目录的群组增加一个SGID
权限,那么当前用户都将以文件属组成员身份操作该文件/目录
1 | chmod g+s [文件名/目录名] # 给文件/目录的属组增加SGID权限 |
SBIT: Sticky Bit(防删除)
给目录的其他人角色增加一个SBIT
权限,那么当前用户在此目录下,将只能针对自己创建的文件进行删除、重命名等操作,而无法删除其他人的文件
1 | chmod o+t [目录] # 给目录的其他人角色增加SBIT权限 |
umask:权限掩码
umask 命令用来控制权限掩码,为新建的文件或目录设置一个初始权限。文件/目录创建时的初始权限 = 默认权限 - 权限掩码
1 | umask # 以数字的形式展示权限掩码 |
0022
中的后三位022
分别表示属主、属组和其他人的权限掩码,假设默认权限为777
,则创建新文件/目录时的初始权限为755
,即rwxr-xr-x
临时设置权限掩码需要使用命令umask [022]
即可,永久设置权限掩码需要修改配置文件/etc/bashrc
第一位的0
表示的是特殊权限,SUID=4,SGID=2,SBIT=1,与后三位不同,第一位的数字表示的就是需要设置的权限,0
就是不加任何特殊权限。
ACL的全称是 Access Control List (访问控制列表) ,一个针对文件/目录的访问控制列表。它在UGO权限(属主,属组,其他人)管理的基础上为文件系统提供一个额外的、更灵活的权限管理机制。它被设计为UNIX文件权限管理的一个补充。ACL允许你给任何的用户或用户组设置任何文件/目录的访问权限。
查看文件/目录的角色权限信息
1 | getfcal [文件/目录] |
1 | 展示了文件名、属主、属组以及各个角色的权限,还包括给其他用户dengpangpang设置的额外权限:rwx, 以及mask值。 |
注意:一旦设置了ACL权限,那么再查看文件权限信息的时候,不必使用ll
命令了,使用getfacl
才能查看到准确的权限。
权限的查找顺序:先查找额外权限,再查找基础权限。
设置mask值
1 | setfacl -m m:[具体权限] [文件] # 给某个文件设置mask值 |
1 | setfacl -m m:r-x a.txt # 给用户dengpangpang设置对文件a.txt的读和执行权限 |
给某个用户设置额外权限
1 | setfacl -m u:[用户名]:[具体权限] [文件名] |
给某个组设置额外权限
1 | setfacl -m g:[组名]:[具体权限] [文件名] |
设置基本角色的权限
设置了ACL权限之后,不建议再使用chmod
去改变基本角色的权限,避免引起权限混乱。应该使用setfacl
设置
1 | setfacl -m u::[具体权限] [文件名] # 设置属主的权限,即相对于其他用户,省略了用户名 |
清理ACL权限
1 | setfacl -b [文件名] # 清理掉文件的所有ACL权限 |
1 | setfacl -x u:[用户名] [文件名] # 清理掉某个用户额外权限 |
ACL的继承
以上命令均是针对文件进行说明的,针对目录的操作与文件相同,但是又有补充,即目录内的文件,可以继承目录的ACL权限。比如:
1 | setfacl -m d:m:[具体权限] [目录] # 给某个目录设置mask值 |
su:set user
用于切换用户身份,从一个用户切换到另一个用户,有两种方式
登陆级别shell
1 | su -用户名 # 直接以该用户身份登录,进入该用户主文件夹。root用户切换到其他用户下无需输入密码,反之需要 |
需要加载的文件:
/etc/profile —> /etc/profile.d/*.sh —> ~/.bash_profile —> ~/.bashrc —> /etc/bashrc
非登录级别shell
1 | su 用户名 # 不进入该用户主文件夹,仍停留在原文件夹内 |
需要加载的文件:
~/.bashrc —> /etc/bashrc —> /etc/profile.d/*.sh
如果想针对所有用户以及登录非登录的shell设置统一的配置,就把配置命令写到 /etc/bashrc
文件中
su指令的优点是简单粗暴,但是缺点是容易造成root密码泄露,普通用户获得所有管理权限风险也比较大
sudo指令可以实现普通用户在当前身份下获得部分管理权限,且不需要输入root密码,缺点是相对复杂。
如何配置权限?
将普通用户添加为管理员可以使用vim编辑器来修改配置文件/etc/sudoers
来分配权限。配置之后可以使用visudo -c
命令来检查语法,确保配置正确。
也可以将用户添加进wheel
组即可:
1 | usermod -a -G wheel [用户名] |