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

12465 次点击
所在节点    Linux
70 条回复
kideny
2016-08-15 08:54:24 +08:00
用 git 克隆的代码,用户组和用户都会变成 git ,好烦躁。
每次都要 chown www-data:www-data -R .
有没有简单的方法啊。
tianshiyeben
2016-08-15 08:55:28 +08:00
我就经常用 777 ,这些基础真不懂
scnace
2016-08-15 09:06:29 +08:00
虽然早就知道了 还是支持下楼主的这种科普行为(
mozartgho
2016-08-15 09:24:02 +08:00
这是基本的 Linux 常识啊,不过还是支持楼科普
zhanfenghai
2016-08-15 09:42:48 +08:00
Linux 小白 之前这边遇到权限问题的时候 老大都是直接让我使用 777 我要不要把这个告诉老大呢
MikuM97
2016-08-15 09:45:46 +08:00
惹毛了我一般把网站的根目录直接 chown -R nginx:nginx ,哪来这么多废话
yaxin
2016-08-15 09:49:14 +08:00
我还以为系统底层到底干了些什么呢!!!
tairan2006
2016-08-15 10:09:30 +08:00
777 就是作死=_=
sheep3
2016-08-15 10:32:06 +08:00
755 是才是常用吧==
ericls
2016-08-15 10:39:47 +08:00
还是 ACL 好用
zhengkai
2016-08-15 11:06:25 +08:00
chmod 777 的根源在于,缺点谁都懂,但是就是因为太多半瓶不满的人只知道说前半句不知道后半句,拿不出完全有效的解决方法,结果很多人知道 777 不好也只能用着

关于这个问题,银弹是 POSIX ACL ,并配以完善的用户 /组的管理
jason19659
2016-08-15 11:09:48 +08:00
(
lenoir
2016-08-15 11:30:02 +08:00
有人喜欢把这些基础知识掖着藏着,站在高山顶上取笑正在爬山的人。
DaCong
2016-08-15 11:50:42 +08:00
说实话,我看到标题的时候还以为说的是利用 777 的漏洞做一些事情。。。
看来完全不是那回事
不过,支持楼主的科普,虽然说我早就知道了,但毕竟以现在 v2 的水平,这种科普还是有作用的。
wzqcongcong
2016-08-15 12:44:18 +08:00
一个 777 引发的撕逼~
DRcoding
2016-08-15 12:49:17 +08:00
你知道 XXX API 、 XXX 命令、 XXX 函数吗...?

甲:拿多少钱干多少事嘛,虽然我知道那些个利弊,我爱用哪个就用哪个。

乙:什么,这你都不知道?!! 这可是基础知识,要是有人不知道,我能让他滚蛋就滚蛋,不能我也得鄙视他!

丙:乃们这样嘲笑新手是不对的,谁不是从新手过来的呢,装逼贩子。

丁:我就觉得以现在 XX 社区,XX 一辈的水平,不知道很正常嘛,来给他们科普科普涨涨姿势,真是的。

总结帖子几个观点如上,不代表本人观点,不针对任何人。
julyclyde
2016-08-15 13:10:45 +08:00
从“第一时间想到 777 ”就知道……这人技术素质不行啊
zacard
2016-08-15 16:49:51 +08:00
支持楼主。还是有涨知识的,比如为什么是 1 , 2 , 4
hzqim
2016-08-15 16:55:34 +08:00
我的 NAS 数据目录用的是 2775 。
adfsadfssfd
2016-08-15 18:49:26 +08:00
ntfs-3g mount 是 777 这个怎么解决?

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

https://tanronggui.xyz/t/299246

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

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

© 2021 V2EX