chmod -R 777 究竟是什么鬼
今天有个新同事问我:
- 使用 ls –l 查看文件,前面显示的-rwxrwxr-x是什么意思?
- chmod 755 xxx.sh 又是什么意思?
1分钟简单说下,这两个和权限相关的问题。
[TOC]
基础知识
先说下文件类型,访问方式,权限分类。
Linux下,分为这么几种文件类型:
- d 目录directory
- l 符号链接link
- s 套接字socket
- c 字符设备char
- p 命名管道pipe
- - 其他,不属于以上几类
文件创建后,有三种访问方式:
- 读(read):显示内容
- 写(write):编辑内容,删除文件
- 执行(execute):执行文件
针对用户,文件有三类权限:
- 创建人(user)权限:创建文件的人
- 组(group)用户权限:和拥有者处于同一用户组的其他人
- 其他(other)用户权限
了解了文件类型,访问方式,三类权限之后,第一个问题就比较好解答了。
权限字符
可以使用 ls -l 命令查看文件权限。下面是一个例子:
ls -l example.txt
输出内容及详细权限参数含义:
-rwxrwxr-x 12 coder coder 2.0K Apr 1 17:51 example.txt
|[-][-][-] - [----][----]
| | | | | | |
| | | | | | +-------------------> 7. 属组
| | | | | +-------------------------> 6. 属主
| | | | +------------------------------> 5. i-node连接数
| | | +---------------------------------> 4. 其他用户权限
| | +------------------------------------> 3. 属组权限
| +---------------------------------------> 2. 属主权限
+-----------------------------------------> 1. 文件类型
例如 -rwxrwxr-x 共有十个字符,分为四个部分:
- 第1个字符表示文件类型:[-]表示普通文件
- 第234字符表示创建人的权限:[wxr]表示可读,可写,可执行
- 第567字符表示组用户权限:[wxr]表示可读,可写,可执行
- 第890字符表示其他用户权限:[r-x]表示可读,可执行
权限数字
文件权限可以用数字或符号格式表示。
user group everyone
- rwx rwx rwx
||| ||| |||
421 421 421
7 7 7
权限可以由三位或四位数字组成,每位数字可以是4、2、1 和 0 的和,范围从0到7。当使用3位数字时,第一位代表文件所有者的权限,第二位代表文件组的权限,最后一位代表所有其他用户的权限。
0 (0+0+0) - 没有权限。
1 (0+0+1) - 仅执行权限。
2 (0+2+0) - 仅写入权限。
3 (0+2+1) - 写入和执行权限。
4 (4+0+0) - 只读权限。
5 (4+0+1) - 读取和执行权限。
6 (4+2+0) - 读写权限。
7 (4+2+1) - 读取、写入和执行权限。
例如,如果权限设置为750,则表示文件所有者有读、写、执行权限,文件组有读、执行权限,其他用户没有权限:
属主:rwx=4+2+1=7
属组:r-x=4+0+1=5
其他:—-=0+0+0=0
当权限使用4位数字时,第一个数字的含义如下:
setuid = 4
setgid = 2
sticky = 1
no changes = 0
接下来的三位数的含义与使用三位数时相同。
如果第一位数字为0,则可以省略,模式可以用3位数字表示,例如0755与755相同。
要以数字(八进制)表示法查看文件的权限,请使用stat命令:
stat -c "%a" filename
输出数字如:644。
如何改变文件的权限呢?
chmod命令用于改变文件的权限,它有两种使用方法。
方法1:使用权限字符
chomod [who] [operator] [permission] filename
[who]
u:创建人
g:组用户
o:其他用户
a:所有用户(all)
[operator]
+:增加权限
-:取消权限
=:设定权限
[permission]
r:读
w:写
x:执行
举几个例子:
chmod u+x xxx.sh #.添加可执行权限
chmod go-w xxx.sh #.不让其他用户修改
方法2:使用权限数字
chmod [mode] filename
[mode]是一个3位八进制数:
- 第一位表示创建者权限
- 第二位表示组用户权限
- 第三位表示其他用户权限
更具体的:
400:创建者可读
200:创建者可写
100:创建者可执行
040:组用户可读
020:组用户可写
010:组用户可执行
004:其他用户可读
002:其他用户可写
001:其他用户可执行
3位对应位的对应数字加起来,最终就是三类用户的最终权限。
如何回收权限
如何回收非创建者用户对xxx.sh的所有权限?
chmod 700 xxx.sh
分解:
第一位7:4+2+1,创建者,可读可写可执行
第二位0:组用户,无权限
第三位0:其他用户,无权限
xxx.sh只允许创建者修改,允许其他用户读取和执行,怎么设置?
chmod 755 xxx.sh
第一位7:4+2+1,创建者,可读可写可执行
第二位5:4+1,组用户,可读可执行
第三位5:4+1,其他用户,可读可执行
画外音:一般来说,写了一个工具,只允许自己修改,不允许别人修改,但允许别人使用,这就是755。有意思么?
644 对应 -rw-r--r--
755 对应 -rwxr-xr-x
777 对应 -rwxrwxrwx
永远不要 chmod 777
如果你以递归方式将 /var/www 目录下所有文件和子目录的权限更改为777(rwx rwx rwx),则意味着它将对所有用户都是可读、可写和可执行的,即系统上的任何用户都可以创建、删除或修改该目录中的文件,这将带来巨大的安全风险。
如果你的Web服务器遇到权限问题,请使用chown命令将文件的所有权更改为运行应用程序的用户,并将文件的权限设置为644,将目录的权限设置为755,而不是递归地将权限设置为777。
要设置要运行的正确权限,请执行以下操作:
chown -R www: /var/www
find /var/www -type d -exec chmod 755 {} \;
find /var/www -type f -exec chmod 644 {} \;
这样,只有root用户、文件所有者或具有sudo权限的用户才能更改文件的权限。
**使用chmod时要格外小心,特别是在递归更改权限的时候。**