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

2016-08-14 18:56:18 +08:00
 learning

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

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

Unix 权限

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

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

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

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

为什么是 1 、 2 、 4 ?

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

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

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 微信号:程序员晋级之路『 code-learning 』

12467 次点击
所在节点    Linux
70 条回复
flyingghost
2016-08-15 20:02:26 +08:00
@kideny
git config core.filemode false
FrankHB
2016-08-15 20:05:43 +08:00
@gdtv 难道拿 5k 你还多花力气特意去 umask 么(手动滑稽
FrankHB
2016-08-15 20:07:00 +08:00
@zhengkai 真不能指望理解得了 777 的用户就能知道 ACL 是个什么鬼……成本忽地就上去了。
ecloud
2016-08-15 20:53:23 +08:00
我讲 RHCE 课的时候是这么让学员记住权限数字的

1 ,就是要,你要干事,就是执行
2 ,写代码的人都很二,所以 2 是写
4 ,死人了,读书烦死人了,所以 4 是读
任意两者相加表示两个属性都具有
三个全加一起就是全都有
shiji
2016-08-15 22:35:13 +08:00
Linux 里面文件夹的权限和文件的权限有一些不同,(这是我曾经掉过的坑),我就直接引用一个吧:


总结 linux 下目录和文件的权限区别
文件:读文件内容( r )、写数据到文件( w )、作为命令执行文件( x )。
目录:读包含在目录中的文件名称( r )、写信息到目录中去(增加和删除索引点的连结)、搜索目录(能用该目录名称作为路径名去访问它所包含的文件和子目录)
具体说就是:
( 1 )有只读权限的用户不能用 cd 进入该目录:还必须有执行权限才能进入。
( 2 )有执行权限的用户只有在知道文件名,并拥有读权利的情况下才可以访问目录下的文件。
( 3 )必须有读和执行权限才可以 ls 列出目录清单,或使用 cd 命令进入目录。
( 4 )有目录的写权限,可以创建、删除或修改目录下的任何文件或子目录,即使使该文件或子目录属于其他用户也是如此。
BROWNURSIDAE
2016-08-16 07:59:18 +08:00
我是接触了 Android 手机才知道的 read write execute
wnn5191991
2016-08-18 11:01:16 +08:00
001 002 004
mingyun
2016-08-21 09:04:11 +08:00
@ecloud 哈哈,这比喻
mritd
2016-10-06 10:24:43 +08:00
@gdtv 666 拿 1000 我就 7777
mritd
2016-10-06 10:26:38 +08:00
其实权限还有一位😂😂😂

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/299246

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX