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

12153 次点击
所在节点    Linux
70 条回复
menc
2016-08-14 19:01:30 +08:00
这不是基本知识么。。 V 站有人不懂么
wellsc
2016-08-14 19:03:49 +08:00
这不是基本知识么。。 V 站有人不懂么
ynyounuo
2016-08-14 19:10:19 +08:00
@menc 当然有人不懂呀, V 站还有很多人连图都不会发呢。
gdtv
2016-08-14 19:11:38 +08:00
拿 5 千元工资,我就 777
拿 1 万元工资,我就 755 或者 644
ahcat
2016-08-14 19:12:53 +08:00
这明明是推广。
SourceMan
2016-08-14 19:14:27 +08:00
啦啦啦,往下啦
Bardon
2016-08-14 19:16:23 +08:00
我觉得就算拿 3000 工资,这个也应该要懂。
就譬如翻译文员对于 hello 的熟练程度。
Tink
2016-08-14 19:17:22 +08:00
对于很多 Linux 小白算是科普了吧,还是支持一下楼主
yangxin0
2016-08-14 19:33:34 +08:00
难道没人用 o+w 、 o+r 么、数字好暴力
Trim21
2016-08-14 19:36:14 +08:00
不懂的看了一楼二楼吓得不敢说话
ivmm
2016-08-14 19:39:58 +08:00
希望不要拿站在峰顶的高度看正在爬山的人。
littlepanzh
2016-08-14 19:44:36 +08:00
@Trim21 一楼二楼也没说错,这确实是基本知识,不过你要是不知道,说明你还需要继续努力学习呀~
ilotuo
2016-08-14 19:46:21 +08:00
既然讲了就应该把 sid/目录的权限 也讲讲
autocar23
2016-08-14 19:49:49 +08:00
初学 linux 建议看鸟哥的 linux 私房菜
http://cn.linux.vbird.org/linux_basic/fedora_4/fc4.php
mdzz
2016-08-14 19:59:16 +08:00
如果把目录权限和 set-user-ID 、 set-group-ID 等内容加上,回复可能就是另一副样子了
icybee
2016-08-14 20:45:56 +08:00
一本正经的在 v2 科普小学知识。。。可以。。。这广告很硬。。。而且可以完全过滤稍微有一点常识的后端,只剩下目标客户。。。嗯
lHUAC
2016-08-14 20:47:23 +08:00
文件 644 ,文件夹 755 ,权限用户和用户组为 www 或者是 www-data
q397064399
2016-08-14 21:16:40 +08:00
大部分时候没必要,真的, linux 的哲学就是把太多东西抽象的不成样子了,
即使是高手程序员 对文件目录的权限了如指掌, 777 o+w 644 一堆 是啥子鬼,又不好记,还特别坑爹,
文件权限这玩意,还是直接抽象成字符串控制比较好,真心的 一堆数字太难记忆了
q397064399
2016-08-14 21:21:04 +08:00
一个 ls 参数 h 居然是 human readable 的隐喻,有的时候真的蛋疼,真的,很多命令的隐喻规则完全不是一回事,有的命令参数 h 是 help 的隐喻 有的 h 就更加不知道啥一回事了
lan894734188
2016-08-14 21:26:03 +08:00
程序问题选择 777 环境问题选择 chown

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

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

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

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

© 2021 V2EX