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 · 12112 次点击
    这是一个创建于 2783 天前的主题,其中的信息可能已经有所发展或是发生改变。

    警告:杜绝使用 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  
       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 科普小学知识。。。可以。。。这广告很硬。。。而且可以完全过滤稍微有一点常识的后端,只剩下目标客户。。。嗯
    lHUAC
        17
    lHUAC  
       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  
       2016-08-15 13:10:45 +08:00
    从“第一时间想到 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   ·   我们的愿景   ·   实用小工具   ·   2969 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 46ms · UTC 15:06 · PVG 23:06 · LAX 08:06 · JFK 11:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.