警告:杜绝使用 chmod 777 ,尤其是在生产环境!
当我们遇到各种权限问题的时候,例如 Apache 告诉你 Permission dined ,是不是第一时间想到chmod 777
?我们知道chmod
是更改权限,那么777
到底是什么呢?
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 呢?因为这是二进制:
这么做最主要有两个好处:节省空间和提升运算效率。
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 ,还有什么办法呢?
_www
,想办法让_www
拥有权限最后再劝大家一句:不要再用 chmod 777 了
原文链接: http://t.cn/RtWZPbn 微信号:程序员晋级之路『 code-learning 』
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.