警告:杜绝使用 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 』
|  |      1menc      2016-08-14 19:01:30 +08:00  9 这不是基本知识么。。 V 站有人不懂么 | 
|  |      2wellsc      2016-08-14 19:03:49 +08:00 via Android 这不是基本知识么。。 V 站有人不懂么 | 
|      4gdtv      2016-08-14 19:11:38 +08:00  37 拿 5 千元工资,我就 777 拿 1 万元工资,我就 755 或者 644 | 
|      5ahcat      2016-08-14 19:12:53 +08:00 via iPhone 这明明是推广。 | 
|  |      6SourceMan      2016-08-14 19:14:27 +08:00 via iPhone 啦啦啦,往下啦 | 
|      7Bardon      2016-08-14 19:16:23 +08:00  1 我觉得就算拿 3000 工资,这个也应该要懂。 就譬如翻译文员对于 hello 的熟练程度。 | 
|  |      8Tink PRO 对于很多 Linux 小白算是科普了吧,还是支持一下楼主 | 
|  |      9yangxin0      2016-08-14 19:33:34 +08:00 via iPhone  1 难道没人用 o+w 、 o+r 么、数字好暴力 | 
|  |      10Trim21      2016-08-14 19:36:14 +08:00 via Android 不懂的看了一楼二楼吓得不敢说话 | 
|  |      11ivmm      2016-08-14 19:39:58 +08:00  4 希望不要拿站在峰顶的高度看正在爬山的人。 | 
|  |      12littlepanzh      2016-08-14 19:44:36 +08:00 via iPhone @Trim21 一楼二楼也没说错,这确实是基本知识,不过你要是不知道,说明你还需要继续努力学习呀~ | 
|  |      13ilotuo      2016-08-14 19:46:21 +08:00 既然讲了就应该把 sid/目录的权限 也讲讲 | 
|  |      14autocar23      2016-08-14 19:49:49 +08:00 初学 linux 建议看鸟哥的 linux 私房菜 http://cn.linux.vbird.org/linux_basic/fedora_4/fc4.php | 
|  |      15mdzz      2016-08-14 19:59:16 +08:00 如果把目录权限和 set-user-ID 、 set-group-ID 等内容加上,回复可能就是另一副样子了 | 
|  |      16icybee      2016-08-14 20:45:56 +08:00 一本正经的在 v2 科普小学知识。。。可以。。。这广告很硬。。。而且可以完全过滤稍微有一点常识的后端,只剩下目标客户。。。嗯 | 
|  |      17nopicsayjb      2016-08-14 20:47:23 +08:00 文件 644 ,文件夹 755 ,权限用户和用户组为 www 或者是 www-data | 
|  |      18q397064399      2016-08-14 21:16:40 +08:00 大部分时候没必要,真的, linux 的哲学就是把太多东西抽象的不成样子了, 即使是高手程序员 对文件目录的权限了如指掌, 777 o+w 644 一堆 是啥子鬼,又不好记,还特别坑爹, 文件权限这玩意,还是直接抽象成字符串控制比较好,真心的 一堆数字太难记忆了 | 
|  |      19q397064399      2016-08-14 21:21:04 +08:00 一个 ls 参数 h 居然是 human readable 的隐喻,有的时候真的蛋疼,真的,很多命令的隐喻规则完全不是一回事,有的命令参数 h 是 help 的隐喻 有的 h 就更加不知道啥一回事了 | 
|  |      20lan894734188      2016-08-14 21:26:03 +08:00 via Android 程序问题选择 777 环境问题选择 chown | 
|  |      21secondwtq      2016-08-14 21:33:41 +08:00 @q397064399 建议看看 Windows Powershell | 
|  |      22peartail      2016-08-14 21:45:45 +08:00 via iPad 谢谢,很有用途,收藏了。 lz 比我写的好多了,以后身边的新人问这些问题的时候直接给他们链接。 | 
|  |      24loading      2016-08-14 22:01:08 +08:00 via Android 楼主,你推广就算了,别发这种知识,明显低估 V2EX 的水平,这个知识我 18 年前就知道了。 | 
|  |      27isCyan      2016-08-14 23:36:09 +08:00 via Android 绝对支持知识科普 | 
|  |      28fish267      2016-08-14 23:55:47 +08:00 via iPhone 为科普点赞, 我学习到了为啥 1'2'4 进制 | 
|  |      29ecloud      2016-08-15 00:02:32 +08:00 via iPhone  1 777 还敢拿 5 千?在我这第二天就让他滚蛋 | 
|  |      30jsthon      2016-08-15 05:45:56 +08:00 via Android chown -R <non-root>:www-data <site directory> chmod -R 750 <general directory> chmod -R 770 <writeable directory> 反正我每次都这样不知有没有问题? | 
|  |      31wweir      2016-08-15 06:35:53 +08:00 via Android 靠这种基础的东西拉人气,太过了吧 | 
|  |      32lyz1990      2016-08-15 07:12:01 +08:00 via Android 想问一下你们生存环境的 SELinux 开不开? | 
|  |      33lyz1990      2016-08-15 07:12:34 +08:00 via Android 生产😂 | 
|  |      35zyqf      2016-08-15 07:39:12 +08:00 chown chgrp chmod 就行了. | 
|  |      36kn007      2016-08-15 07:44:51 +08:00 呵呵。。一览众山小 | 
|      37nyaruko      2016-08-15 08:39:28 +08:00  1 大学时候用的 ARM 开发板,是单用户的,任何文件权限都是 777 ,然而大学毕业之后,我成为了一个运维 | 
|      38jeffersonpig      2016-08-15 08:39:32 +08:00  1 然而讲了一堆最基础的东西最终却还是没有解释为什么要杜绝,是楼主内心在存在怀疑和犹豫么哈哈哈! | 
|  |      39bookit      2016-08-15 08:44:47 +08:00  1 此文写得不合格,为什么不用没讲清楚,我以为要讲坏人会如何利用 777 ,会造成什么危害呢 结果看到底也没写 | 
|  |      40ytmsdy      2016-08-15 08:47:33 +08:00 测试环境一般都给 777 ,打着方便,不用移手指。 | 
|  |      41kideny      2016-08-15 08:54:24 +08:00 用 git 克隆的代码,用户组和用户都会变成 git ,好烦躁。 每次都要 chown www-data:www-data -R . 有没有简单的方法啊。 | 
|  |      42tianshiyeben      2016-08-15 08:55:28 +08:00 我就经常用 777 ,这些基础真不懂 | 
|      43scnace      2016-08-15 09:06:29 +08:00 虽然早就知道了  还是支持下楼主的这种科普行为( | 
|  |      44mozartgho      2016-08-15 09:24:02 +08:00 这是基本的 Linux 常识啊,不过还是支持楼科普 | 
|  |      45zhanfenghai      2016-08-15 09:42:48 +08:00 Linux 小白 之前这边遇到权限问题的时候 老大都是直接让我使用 777 我要不要把这个告诉老大呢 | 
|      46MikuM97      2016-08-15 09:45:46 +08:00 惹毛了我一般把网站的根目录直接 chown -R nginx:nginx ,哪来这么多废话 | 
|  |      47yaxin      2016-08-15 09:49:14 +08:00 我还以为系统底层到底干了些什么呢!!! | 
|      48tairan2006      2016-08-15 10:09:30 +08:00 777 就是作死=_= | 
|  |      49sheep3      2016-08-15 10:32:06 +08:00 755 是才是常用吧== | 
|  |      50ericls      2016-08-15 10:39:47 +08:00 还是 ACL 好用 | 
|  |      51zhengkai      2016-08-15 11:06:25 +08:00 chmod 777 的根源在于,缺点谁都懂,但是就是因为太多半瓶不满的人只知道说前半句不知道后半句,拿不出完全有效的解决方法,结果很多人知道 777 不好也只能用着 关于这个问题,银弹是 POSIX ACL ,并配以完善的用户 /组的管理 | 
|  |      52jason19659      2016-08-15 11:09:48 +08:00 ( | 
|      53lenoir      2016-08-15 11:30:02 +08:00  1 有人喜欢把这些基础知识掖着藏着,站在高山顶上取笑正在爬山的人。 | 
|  |      54DaCong      2016-08-15 11:50:42 +08:00 说实话,我看到标题的时候还以为说的是利用 777 的漏洞做一些事情。。。 看来完全不是那回事 不过,支持楼主的科普,虽然说我早就知道了,但毕竟以现在 v2 的水平,这种科普还是有作用的。 | 
|      55wzqcongcong      2016-08-15 12:44:18 +08:00 一个 777 引发的撕逼~ | 
|  |      56DRcoding      2016-08-15 12:49:17 +08:00 你知道 XXX API 、 XXX 命令、 XXX 函数吗...? 甲:拿多少钱干多少事嘛,虽然我知道那些个利弊,我爱用哪个就用哪个。 乙:什么,这你都不知道?!! 这可是基础知识,要是有人不知道,我能让他滚蛋就滚蛋,不能我也得鄙视他! 丙:乃们这样嘲笑新手是不对的,谁不是从新手过来的呢,装逼贩子。 丁:我就觉得以现在 XX 社区,XX 一辈的水平,不知道很正常嘛,来给他们科普科普涨涨姿势,真是的。 总结帖子几个观点如上,不代表本人观点,不针对任何人。 | 
|      57julyclyde      2016-08-15 13:10:45 +08:00 从“第一时间想到 777 ”就知道……这人技术素质不行啊 | 
|      58zacard      2016-08-15 16:49:51 +08:00 支持楼主。还是有涨知识的,比如为什么是 1 , 2 , 4 | 
|      59hzqim      2016-08-15 16:55:34 +08:00 我的 NAS 数据目录用的是 2775 。 | 
|      60adfsadfssfd      2016-08-15 18:49:26 +08:00 ntfs-3g mount 是 777 这个怎么解决? | 
|  |      61flyingghost      2016-08-15 20:02:26 +08:00 @kideny  git config core.filemode false | 
|  |      64ecloud      2016-08-15 20:53:23 +08:00 via iPhone 我讲 RHCE 课的时候是这么让学员记住权限数字的 1 ,就是要,你要干事,就是执行 2 ,写代码的人都很二,所以 2 是写 4 ,死人了,读书烦死人了,所以 4 是读 任意两者相加表示两个属性都具有 三个全加一起就是全都有 | 
|  |      65shiji      2016-08-15 22:35:13 +08:00 Linux 里面文件夹的权限和文件的权限有一些不同,(这是我曾经掉过的坑),我就直接引用一个吧: “ 总结 linux 下目录和文件的权限区别 文件:读文件内容( r )、写数据到文件( w )、作为命令执行文件( x )。 目录:读包含在目录中的文件名称( r )、写信息到目录中去(增加和删除索引点的连结)、搜索目录(能用该目录名称作为路径名去访问它所包含的文件和子目录) 具体说就是: ( 1 )有只读权限的用户不能用 cd 进入该目录:还必须有执行权限才能进入。 ( 2 )有执行权限的用户只有在知道文件名,并拥有读权利的情况下才可以访问目录下的文件。 ( 3 )必须有读和执行权限才可以 ls 列出目录清单,或使用 cd 命令进入目录。 ( 4 )有目录的写权限,可以创建、删除或修改目录下的任何文件或子目录,即使使该文件或子目录属于其他用户也是如此。 ” | 
|  |      66BROWNURSIDAE      2016-08-16 07:59:18 +08:00 via Android 我是接触了 Android 手机才知道的 read write execute | 
|  |      67wnn5191991      2016-08-18 11:01:16 +08:00 001 002 004 | 
|  |      70mritd      2016-10-06 10:26:38 +08:00 via iPhone 其实权限还有一位😂😂😂 |