当我们 chmod 777 的时候,到底干了些什么? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
learning
V2EX    Linux

当我们 chmod 777 的时候,到底干了些什么?

  •  5
     
  •   learning
    learning 2016-08-14 18:56:18 +08:00 13071 次点击
    这是一个创建于 3396 天前的主题,其中的信息可能已经有所发展或是发生改变。

    警告:杜绝使用 chmod 777 ,尤其是在生产环境!

    当我们遇到各种权限问题的时候,例如 Apache 告诉你 Permission dined ,是不是第一时间想到chmod 777?我们知道chmod是更改权限,那么777到底是什么呢?

    Unix 权限

    Unix 系统的权限分三种,分别是拥有者( Owner )、用户组( Group )、其它用户( Other ),用ls-l参数可以查看文件的权限。

    图片描述

    每个项目前面那一串乱七八糟的字母和横杠,就是权限。第一位比较简单,指的是文件类型:-代表普通文件,d代表文件夹, Unix 下文件夹是特殊的文件。后面 9 位分三组,每组就代表了对应用户的权限:

    图片描述

    • r = 4: 读
    • w = 2: 写
    • x = 1: 执行

    现在看一下上面那个图的bin目录,它的权限是drwxr-xr-x就可以解读为:

    • d: 这是个目录
    • rwx: 拥有者(也就是 Learning )可读、可写、可执行
    • r-x: 用户组(也就是 admin )可读、可执行、但不可写
    • r-x: 其它用户,跟用户组的权限一样

    其中执行权限有什么用呢?可能有人并不知道,比如我有个 C 语言写的程序,编译出来后是a.out,没有执行权限的话,用./a.out命令是执行不了的。 shell 脚本就不一样,假设我有个脚本叫install.sh,这个文件没有执行权限,我还可以用sh install.sh执行,但是如果加上执行权限,./install.sh就会方便很多,还能用命令行自动补全。

    为什么是 1 、 2 、 4 ?

    那么权限为什么是 1 、 2 、 4 呢?因为这是二进制:

    • 1: 001
    • 2: 010
    • 4: 100

    这么做最主要有两个好处:节省空间和提升运算效率。

    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 』

    clipboard.png

    70 条回复    2016-10-06 10:26:38 +08:00
    menc
        1
    menc  
       2016-08-14 19:01:30 +08:00   9
    这不是基本知识么。。 V 站有人不懂么
    wellsc
        2
    wellsc  
       2016-08-14 19:03:49 +08:00 via Android
    这不是基本知识么。。 V 站有人不懂么
    ynyounuo
        3
    ynyounuo  
       2016-08-14 19:10:19 +08:00 via iPhone
    @menc 当然有人不懂呀, V 站还有很多人连图都不会发呢。
    gdtv
        4
    gdtv  
       2016-08-14 19:11:38 +08:00   37
    拿 5 千元工资,我就 777
    拿 1 万元工资,我就 755 或者 644
    ahcat
        5
    ahcat  
       2016-08-14 19:12:53 +08:00 via iPhone
    这明明是推广。
    SourceMan
        6
    SourceMan  
       2016-08-14 19:14:27 +08:00 via iPhone
    啦啦啦,往下啦
    Bardon
        7
    Bardon  
       2016-08-14 19:16:23 +08:00   1
    我觉得就算拿 3000 工资,这个也应该要懂。
    就譬如翻译文员对于 hello 的熟练程度。
    Tink
        8
    Tink  
    PRO
       2016-08-14 19:17:22 +08:00 via iPhone
    对于很多 Linux 小白算是科普了吧,还是支持一下楼主
    yangxin0
        9
    yangxin0  
       2016-08-14 19:33:34 +08:00 via iPhone   1
    难道没人用 o+w 、 o+r 么、数字好暴力
    Trim21
        10
    Trim21  
       2016-08-14 19:36:14 +08:00 via Android
    不懂的看了一楼二楼吓得不敢说话
    ivmm
        11
    ivmm  
       2016-08-14 19:39:58 +08:00   4
    希望不要拿站在峰顶的高度看正在爬山的人。
    littlepanzh
        12
    littlepanzh  
       2016-08-14 19:44:36 +08:00 via iPhone
    @Trim21 一楼二楼也没说错,这确实是基本知识,不过你要是不知道,说明你还需要继续努力学习呀~
    ilotuo
        13
    ilotuo  
       2016-08-14 19:46:21 +08:00
    既然讲了就应该把 sid/目录的权限 也讲讲
    autocar23
        14
    autocar23  
       2016-08-14 19:49:49 +08:00
    初学 linux 建议看鸟哥的 linux 私房菜
    http://cn.linux.vbird.org/linux_basic/fedora_4/fc4.php
    mdzz
        15
    mdzz  
       2016-08-14 19:59:16 +08:00
    如果把目录权限和 set-user-ID 、 set-group-ID 等内容加上,回复可能就是另一副样子了
    icybee
        16
    icybee  
       2016-08-14 20:45:56 +08:00
    一本正经的在 v2 科普小学知识。。。可以。。。这广告很硬。。。而且可以完全过滤稍微有一点常识的后端,只剩下目标客户。。。嗯
    nopicsayjb
        17
    nopicsayjb  
       2016-08-14 20:47:23 +08:00
    文件 644 ,文件夹 755 ,权限用户和用户组为 www 或者是 www-data
    q397064399
        18
    q397064399  
       2016-08-14 21:16:40 +08:00
    大部分时候没必要,真的, linux 的哲学就是把太多东西抽象的不成样子了,
    即使是高手程序员 对文件目录的权限了如指掌, 777 o+w 644 一堆 是啥子鬼,又不好记,还特别坑爹,
    文件权限这玩意,还是直接抽象成字符串控制比较好,真心的 一堆数字太难记忆了
    q397064399
        19
    q397064399  
       2016-08-14 21:21:04 +08:00
    一个 ls 参数 h 居然是 human readable 的隐喻,有的时候真的蛋疼,真的,很多命令的隐喻规则完全不是一回事,有的命令参数 h 是 help 的隐喻 有的 h 就更加不知道啥一回事了
    lan894734188
        20
    lan894734188  
       2016-08-14 21:26:03 +08:00 via Android
    程序问题选择 777 环境问题选择 chown
    secondwtq
        21
    secondwtq  
       2016-08-14 21:33:41 +08:00
    @q397064399 建议看看 Windows Powershell
    peartail
        22
    peartail  
       2016-08-14 21:45:45 +08:00 via iPad
    谢谢,很有用途,收藏了。 lz 比我写的好多了,以后身边的新人问这些问题的时候直接给他们链接。
    Yien
        23
    Yien  
       2016-08-14 21:47:21 +08:00
    @Trim21 不懂的看了一楼二楼吓得不敢说话 X2
    loading
        24
    loading  
       2016-08-14 22:01:08 +08:00 via Android
    楼主,你推广就算了,别发这种知识,明显低估 V2EX 的水平,这个知识我 18 年前就知道了。
    XhstormR
        25
    XhstormR  
       2016-08-14 22:21:27 +08:00   1
    @loading V2EX 也高不到哪里去,随便注册个号又不要邀请码,有这么优越?
    loading
        26
    loading  
       2016-08-14 22:31:32 +08:00 via Android
    @XhstormR 嗯,现在 V2EX 火了,新人参差不齐。
    isCyan
        27
    isCyan  
       2016-08-14 23:36:09 +08:00 via Android
    绝对支持知识科普
    fish267
        28
    fish267  
       2016-08-14 23:55:47 +08:00 via iPhone
    为科普点赞,
    我学习到了为啥 1'2'4 进制
    ecloud
        29
    ecloud  
       2016-08-15 00:02:32 +08:00 via iPhone   1
    777 还敢拿 5 千?在我这第二天就让他滚蛋
    jsthon
        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>

    反正我每次都这样不知有没有问题?
    wweir
        31
    wweir  
       2016-08-15 06:35:53 +08:00 via Android
    靠这种基础的东西拉人气,太过了吧
    lyz1990
        32
    lyz1990  
       2016-08-15 07:12:01 +08:00 via Android
    想问一下你们生存环境的 SELinux 开不开?
    lyz1990
        33
    lyz1990  
       2016-08-15 07:12:34 +08:00 via Android
    生产
    odoooo
        34
    odoooo  
       2016-08-15 07:30:01 +08:00
    @lyz1990 不开
    zyqf
        35
    zyqf  
       2016-08-15 07:39:12 +08:00
    chown chgrp chmod 就行了.
    kn007
        36
    kn007  
       2016-08-15 07:44:51 +08:00
    呵呵。。一览众山小
    nyaruko
        37
    nyaruko  
       2016-08-15 08:39:28 +08:00   1
    大学时候用的 ARM 开发板,是单用户的,任何文件权限都是 777 ,然而大学毕业之后,我成为了一个运维
    jeffersonpig
        38
    jeffersonpig  
       2016-08-15 08:39:32 +08:00   1
    然而讲了一堆最基础的东西最终却还是没有解释为什么要杜绝,是楼主内心在存在怀疑和犹豫么哈哈哈!
    bookit
        39
    bookit  
       2016-08-15 08:44:47 +08:00   1
    此文写得不合格,为什么不用没讲清楚,我以为要讲坏人会如何利用 777 ,会造成什么危害呢

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

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

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

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

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

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

    总结帖子几个观点如上,不代表本人观点,不针对任何人。
    julyclyde
        57
    julyclyde  
       
    从“第一时间想到 777 ”就知道……这人技术素质不行啊
    zacard
        58
    zacard  
       2016-08-15 16:49:51 +08:00
    支持楼主。还是有涨知识的,比如为什么是 1 , 2 , 4
    hzqim
        59
    hzqim  
       2016-08-15 16:55:34 +08:00
    我的 NAS 数据目录用的是 2775 。
    adfsadfssfd
        60
    adfsadfssfd  
       2016-08-15 18:49:26 +08:00
    ntfs-3g mount 是 777 这个怎么解决?
    flyingghost
        61
    flyingghost  
       2016-08-15 20:02:26 +08:00
    @kideny
    git config core.filemode false
    FrankHB
        62
    FrankHB  
       2016-08-15 20:05:43 +08:00
    @gdtv 难道拿 5k 你还多花力气特意去 umask 么(手动滑稽
    FrankHB
        63
    FrankHB  
       2016-08-15 20:07:00 +08:00
    @zhengkai 真不能指望理解得了 777 的用户就能知道 ACL 是个什么鬼……成本忽地就上去了。
    ecloud
        64
    ecloud  
       2016-08-15 20:53:23 +08:00 via iPhone
    我讲 RHCE 课的时候是这么让学员记住权限数字的

    1 ,就是要,你要干事,就是执行
    2 ,写代码的人都很二,所以 2 是写
    4 ,死人了,读书烦死人了,所以 4 是读
    任意两者相加表示两个属性都具有
    三个全加一起就是全都有
    shiji
        65
    shiji  
       2016-08-15 22:35:13 +08:00
    Linux 里面文件夹的权限和文件的权限有一些不同,(这是我曾经掉过的坑),我就直接引用一个吧:


    总结 linux 下目录和文件的权限区别
    文件:读文件内容( r )、写数据到文件( w )、作为命令执行文件( x )。
    目录:读包含在目录中的文件名称( r )、写信息到目录中去(增加和删除索引点的连结)、搜索目录(能用该目录名称作为路径名去访问它所包含的文件和子目录)
    具体说就是:
    ( 1 )有只读权限的用户不能用 cd 进入该目录:还必须有执行权限才能进入。
    ( 2 )有执行权限的用户只有在知道文件名,并拥有读权利的情况下才可以访问目录下的文件。
    ( 3 )必须有读和执行权限才可以 ls 列出目录清单,或使用 cd 命令进入目录。
    ( 4 )有目录的写权限,可以创建、删除或修改目录下的任何文件或子目录,即使使该文件或子目录属于其他用户也是如此。
    BROWNURSIDAE
        66
    BROWNURSIDAE  
       2016-08-16 07:59:18 +08:00 via Android
    我是接触了 Android 手机才知道的 read write execute
    wnn5191991
        67
    wnn5191991  
       2016-08-18 11:01:16 +08:00
    001 002 004
    mingyun
        68
    mingyun  
       2016-08-21 09:04:11 +08:00
    @ecloud 哈哈,这比喻
    mritd
        69
    mritd  
       2016-10-06 10:24:43 +08:00 via iPhone
    @gdtv 666 拿 1000 我就 7777
    mritd
        70
    mritd  
       2016-10-06 10:26:38 +08:00 via iPhone
    其实权限还有一位
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1092 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 34ms UTC 18:15 PVG 02:15 LAX 10:15 JFK 13:15
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86