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