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时要格外小心,特别是在递归更改权限的时候。**
Copyright © www.sqlfans.cn 2023 All Right Reserved更新时间: 2022-01-14 17:30:08

results matching ""

    No results matching ""