当我们chmod 777的时候,到底干了些什么?

浏览: 159 发布日期: 2016-08-17 分类: unix

警告:杜绝使用chmod 777,尤其是在生产环境!

当我们遇到各种权限问题的时候,例如Apache告诉你Permission dined,是不是第一时间想到chmod 777?我们知道chmod是更改权限,那么777到底是什么呢?

Unix权限

Unix系统的权限分三种,分别是拥有者(Owner)、用户组(Group)、其它用户(Other),用ls-l参数可以查看文件的权限。

每个项目前面那一串乱七八糟的字母和横杠,就是权限。第一位比较简单,指的是文件类型:-代表普通文件,d代表文件夹,Unix下文件夹是特殊的文件。后面9位分三组,每组就代表了对应用户的权限:

  • r = 4: 读

  • w = 2: 写

  • x = 1: 执行

现在看一下上面那个图的bin目录,它的权限是drwxr-xr-x就可以解读为:

  • d: 这是个目录

  • rwx: 拥有者(也就是Learning)可读、可写、可执行

  • r-x: 用户组(也就是admin)可读、可执行、但不可写

  • r-x: 其它用户,跟用户组的权限一样

其中执行权限有什么用呢?可能有人并不知道,比如我有个C语言写的程序,编译出来后是a.out,没有执行权限的话,用./a.out命令是执行不了的。shell脚本就不一样,假设我有个脚本叫install.sh,这个文件没有执行权限,我还可以用sh install.sh执行,但是如果加上执行权限,./install.sh就会方便很多,还能用命令行自动补全。

为什么是1、2、4?

那么权限为什么是1、2、4呢?因为这是二进制:

  • 1: 001

  • 2: 010

  • 4: 100

这么做最主要有两个好处:节省空间和提升运算效率。

Unix是上个世纪60年代末期产物,当时的资源甚是宝贵,所以,只用3个bit来保存权限,是很不错的选择。当然CPU时间也是很宝贵,不可能为了权限判断让你耗费那么多CPU时间,所以这种二进制权限适合于位运算,位运算是众所周知最快的,可能大家学过却没怎么用过,这里用代码做个例子:

/**
 *     0101 (5)
 * AND 0100 (4)
 *   = 0100 (4)
 */

#define READ    4

int auth = 5; // 101, 权限是读和写

if (auth & READ) {
  doRead(); // 有读权限,执行doRead()
}

这种二进制和位运算不只用在权限上,还用在了一些配置选项里,比如wxPython里也有这么用的,将多个特征分离,需要多种样式时,用位或构造:

slider = wx.Slider(..., style=wx.SL_VERTICAL | wx.SL_AUTOTICKS | wx.SL_LABELS ) 

不用chmod 777,还能怎么办?

那么遇到类似Apache的Permission denied,还有什么办法呢?

  1. 检查一下父级目录,是不是没有权限,就算你这个目录权限是777,而父级目录没权限时,也是白搭。

  2. 是不是symlink?原目录的权限如何?

  3. 一般Apache或nginx的用户和用户组都是_www,想办法让_www拥有权限

最后再劝大家一句:不要再用chmod 777了

原文链接:http://t.cn/RtWZPbn

返回顶部