当我们 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 』

12174 次点击
所在节点    Linux
70 条回复
secondwtq
2016-08-14 21:33:41 +08:00
@q397064399 建议看看 Windows Powershell
peartail
2016-08-14 21:45:45 +08:00
谢谢,很有用途,收藏了。 lz 比我写的好多了,以后身边的新人问这些问题的时候直接给他们链接。
Yien
2016-08-14 21:47:21 +08:00
@Trim21 不懂的看了一楼二楼吓得不敢说话 X2
loading
2016-08-14 22:01:08 +08:00
楼主,你推广就算了,别发这种知识,明显低估 V2EX 的水平,这个知识我 18 年前就知道了。
XhstormR
2016-08-14 22:21:27 +08:00
@loading V2EX 也高不到哪里去,随便注册个号又不要邀请码,有这么优越?
loading
2016-08-14 22:31:32 +08:00
@XhstormR 嗯,现在 V2EX 火了,新人参差不齐。
isCyan
2016-08-14 23:36:09 +08:00
绝对支持知识科普
fish267
2016-08-14 23:55:47 +08:00
为科普点赞,
我学习到了为啥 1'2'4 进制
ecloud
2016-08-15 00:02:32 +08:00
777 还敢拿 5 千?在我这第二天就让他滚蛋
jsthon
2016-08-15 05:45:56 +08:00
chown -R <non-root>:www-data <site directory>

chmod -R 750 <general directory>

chmod -R 770 <writeable directory>

反正我每次都这样不知有没有问题?
wweir
2016-08-15 06:35:53 +08:00
靠这种基础的东西拉人气,太过了吧
lyz1990
2016-08-15 07:12:01 +08:00
想问一下你们生存环境的 SELinux 开不开?
lyz1990
2016-08-15 07:12:34 +08:00
生产😂
odoooo
2016-08-15 07:30:01 +08:00
@lyz1990 不开
zyqf
2016-08-15 07:39:12 +08:00
chown chgrp chmod 就行了.
kn007
2016-08-15 07:44:51 +08:00
呵呵。。一览众山小
nyaruko
2016-08-15 08:39:28 +08:00
大学时候用的 ARM 开发板,是单用户的,任何文件权限都是 777 ,然而大学毕业之后,我成为了一个运维
jeffersonpig
2016-08-15 08:39:32 +08:00
然而讲了一堆最基础的东西最终却还是没有解释为什么要杜绝,是楼主内心在存在怀疑和犹豫么哈哈哈!
bookit
2016-08-15 08:44:47 +08:00
此文写得不合格,为什么不用没讲清楚,我以为要讲坏人会如何利用 777 ,会造成什么危害呢

结果看到底也没写
ytmsdy
2016-08-15 08:47:33 +08:00
测试环境一般都给 777 ,打着方便,不用移手指。

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

https://www.v2ex.com/t/299246

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

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

© 2021 V2EX