>在Linux中一切皆文件
### 文件基本权限
* `-rw-r--r--`
* `-`文件类型 (-文件,d目录, l软连接)
* rw-(u所有者) r--(g所属组) r--(o其他人)
* r读权限 w写权限 x执行权限(execute)
#### chmod 命令
* `chmod [选项] 模式 文件名`
* `-R` 递归
* 模式
* `[ugoa][+-=][rwx]`
* `[mode=421]`
* 修改权限的方式
* chmod u+x test.log 赋予文件拥有者对某个文件的执行权限
* chmod g+w,o+w test.log 赋予文件所属组和其他用户文件写入权限,多个操作用`,`隔开
* chmod a=rwx test.log 赋予全部用户读写和执行权限,`=`直接赋值即可,不用在意原来的权限
>以上操作易用性不高,命令代码量略大,当操作的内容有差别的时候,不方便
* 权限的数字表示
* r --- 4
* w --- 2
* x --- 1
* 示例 (常用)
* `chmod 777 test.log` 赋予文件读写执行权限给全部用户
* `chmod 644 test.log` 赋予拥有者读写权限,所属组和其他用户只读权限
* `chmod 755 test.log` 赋予拥有者读写执行权限,所有者和所属组读权限和可执行权限
* `chmod 467 test.log` 这种权限赋予方式不合理,也不应该出现
#### 权限对文件的作用
* r:读取文件内容(cat more head tail)
* w:编辑,新增,修改文件内容(vi echo)
* 但是不包含删除文件权限,对文件有写权限,对其上一级目录没有写权限,不能删除
* x:可执行
#### 权限对目录的作用
* r:可以查询目录下的文件名(ls)
* w:具有修改目录结构的权限,如新建文件和目录,删除此目录下文件和目录,重命名此目录下文件和目录,剪切(touch rm mv cp)
* x:可以进入目录(cd)
>对文件来讲最高权限是x,对目录来讲最高权限是w ,所以对文件少赋予x权限,目录少赋予w权限;
对目录只能赋予 0(没有权限) 5(rx) 7(rwx) ,其他权限4,1,6没有任何意义
* 添加用户进行测试
```
useradd user1
passwd 123456
```
#### 修改文件的所有者
* `chown 用户名 文件名`
* `chown misty test.log`
>在实际操作过程中,超级用户如果要让一个用户拥有7权限,最合理的方式是直接将当前文件的拥有者修改成这个指定用户,防止为了让这个用户拥有7权限,而不得不赋予其他用户7权限的情况
#### 修改文件的所属组
* `chgrp 组名 文件名`
* `chgrp group1 test.log`
* 第二种方式 `chown 所有者:所属组 文件名`
* `chown root:root test.log`
* 让用户对文件拥有一定的权限
```
要求:拥有一个test目录
让misty拥有所有权限
让所有学员拥有查看权限
其他人不许查看这个目录
mkdir test #创建test目录
useradd misty # 添加一个用户
passwd 123456 # 设置密码
groupadd student #添加一个学生组
gpasswd -a user1 student #向学生组添加一个用户,用户之前已创建
useradd user2 # 添加一个用户 不设置密码
gpasswd -a user2 student # 向学生组添加第二个用户
chown misty:student test # 修改文件夹的所有者和所属组
chmod 750 test # 修改文件夹的权限,赋予拥有者最高权限,用户组读权限和执行权限(可查看可进入),其他用户不给权限
```
>分配文件基本权限时,核心原则:`在最小权限情况下能够实现要求即可`,直接赋予777是极其不负责任和不安全的行为
### 文件默认权限
* 创建文件之后直接赋予的权限就是默认权限
* `umask` 查看默认权限(umask值)
* 0022 默认umask值`0022`
* 第一位0:文件特殊权限
* 022 :文件默认权限
* 修改umask值 `umask umask值` ,临时生效,重启电脑丧失作用
* `umask 033`
* 永久修改umask值 `vi /etc/profile` 在环境变量配置文件里面修改umask值
* 文件的默认权限
* 文件的默认权限不能建立为执行文件,必须手工赋予执行权限,防止直接的执行权限所带来的安群隐患
* 所以文件默认权限最大为666
* 默认权限需要换算成字再相减(不是直接相减)
* 建立文件之后的默认权限 ,为`666` 减去`umask`值
![](image2/image26.png)
#### 目录的默认权限
* 目录的默认权限最大为777
* 默认权限需要换算成字母再相减
* 建立目录之后的默认权限,为777减去umask值
![](image2/image27.png)
* 修改umask值为0000
* 此时创建文件默认权限是666
* 此时创建目录额默认权限是777
* 普通用户的默认umask为0002,对应的权限是664
* root用户的UID为0,普通用户的UID大于500,小于500为管理员
### ACL权限
### 文件特殊权限
### 不可改变位权限
### sudo权限
>以上都是操作文件的权限,只有sudo是操作命令的权限(严格意义命令也是文件)
* root把本来只能超级用户执行的命令赋予普通用户执行
* sudo的操作对象是系统命令
#### sudo的使用
* `visudo` 实际修改的是`/etc/sudoers`文件
* `root ALL=[(ALL)] ALL` #用户名 被管理主机的地址 = (可使用的身份) 授权命令(绝对路径)
* `#%wheel ALL=[(ALL)] ALL` #%组名 被管理主机的地址=(可使用的身份) 授权命令(绝对路径)
* `whereis [命令]` 查看命令的路径
* 例子1:
* 授权普通用户可以重启服务器
```
visudo
#这里也可以不指定身份
- user1 All=(ALL) /sbin/shutdown -r now # 这里写的越详细,用户的权限越小,越粗略,用户的权限越高因为命令以及命令的参数可以指定
:wq
# 切换成普通用户执行如下命令
su - user1 #切换成普通用户
sudo -l #查看可用的sudo命令
sudo /sbin/shutdown -r now #普通用户执行sudo赋予的命令
```
> 命令赋予的时候需要写绝对路径,普通用户执行的时候也需要写绝对路径;centos 6之后可以不用写绝对路径,做了相关的优化,但是在其他的发行版仍然需要
* 例子2 :
* 授权普通用户可以添加其他用户
```
visudo
- user1 ALL=/usr/sbin/useradd #授权添加用户的权限
- user1 ALL=/usr/bin/passwd #授权用户设定密码的权限 ,因为没有密码是无法登陆的
#查看用户是否添加成功
cat /etc/passwd
sudo /usr/sbin/useradd misty #添加用户
sudo /usr/bin/passwd misty #修改密码
#重复输入两次密码,设置完成
### 非常重要,在这里有一个巨大的隐患,因为权限设置太过于简单,导致权限过大,以至于可以修改root用户的密码
#补齐下面这句话,不允许设置root用户的密码,三句代码的顺序不能颠倒
- user1 ALL=/usr/bin/passwd[A-Za-z]*, !/usr/bin/passwd "", !/usr/bin/passwd root
# 用户密码要包含字母,不能为""(不能直接passwd ,以sudo的话是以root身份修改密码),不能为root用户设置密码
### 重要:当以sudo执行命令的时候身份是root,如果passwd后面不带用户,代表可以修改当前用户身份的密码(sudo 为root身份)
```
* 例子三
* 不可以将sudo权限赋值给`vi`命令
```
### 查看保存密码的文件
/bin/vi /etc/shadow # 编辑shadow
ll /etc/shadow #普通用户这个文件根本没有权限
#但是一旦vi被赋予sudo权限,编辑shadow将加密的密码直接替换原来的,就可以修改密码,
```
* 超级管理员打开shadow 文件
![](image2/image28.png)
一键复制
编辑
Web IDE
原始数据
按行查看
历史