Linux中chmod命令

chmod命令用来变更文件或目录的权限。文件或目录权限的控制分别以读取、写入、执行3种一般权限来区分,另有3种特殊权限可供运用。用户可以使用chmod指令去变更文件与目录的权限,设置方式采用文字或数字代号皆可。

背景

最近有个web/rop项目的需求,项目服务端依靠nginx和php提供。在安装完项目后,访问主页面的时候,主页显示nginx 500,http500状态码,第一反应服务有问题,进入项目log文件夹,发现没有日志。然后查看nginx错误日志,
显示项目log目录下没有权限生成日志文件,好了问题找到了,解决吧。

解决

我一看权限问题,那好办啊,果断使用 sudo chmod -R 777 / 命令,重新访问项目主页,OK,解决问题。
但高兴的太早,使用git status命令后,发现被修改权限的目录以及文件,全变成modified,5千个修改,这分支还能用么。 删除掉更改权限的目录,然后重新拉了代码,访问主页,一切又回到了原点。
突然想web/www项目安装过程中有关于目录权限处理,然后照猫画虎,chmod -R a+w /log/ 命令过后, 重新访问主页,发现已解决;再git status查看,没有冗余修改。至此问题成功解决。
问题解决了,想想以前只觉得只要是权限问题,就可以使用777来解决,未免有点太暴力,那就好好研究下chmod命令吧。

学习

chmod命令用来变更文件或目录的权限。在UNIX系统家族里,文件或目录权限的控制分别以读取、写入、执行3种一般权限来区分,另有3种特殊权限可供运用。用户可以使用chmod指令去变更文件与目录的权限,设置方式采用文字或数字代号皆可。符号连接的权限无法变更,如果用户对符号连接修改权限,其改变会作用在被连接的原始文件。(关于符号链接参考ln -s命令)

语法

1
chmod [-cfvR] [--help] [--version] mode file...

参数

mode : 权限设定字串,格式如下 :
[ugoa…][[+-=][rwxX]…][,…]

  • 其中:
    u 表示该文件的拥有者,g 表示与该文件的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。

    +表示增加权限、-表示取消权限、= 表示唯一设定权限。

    r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该文件是个子目录或者该文件已经被设定过为可执行。

  • 其他参数说明:
    -c : 若该文件权限确实已经更改,才显示其更改动作
    -f : 若该文件权限无法被更改也不要显示错误讯息
    -v : 显示权限变更的详细资料
    -R : 对目前目录下的所有文件与子目录进行相同的权限变更(即以递回的方式逐个变更)
    –help : 显示辅助说明
    –version : 显示版本

实例

文字模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#将文件 file1.txt 设为所有人皆可读取
chmod ugo+r file1.txt
#将文件 file1.txt 设为所有人皆可读取
chmod a+r file1.txt
#将文件 file1.txt 与 file2.txt 设为该文件拥有者,与其所属同一个群体者可写入,但其他以外的人则不可写入
chmod ug+w,o-w file1.txt file2.txt
#将 ex1.py 设定为只有该文件拥有者可以执行
chmod u+x ex1.py
#将目前目录下的所有文件与子目录皆设为任何人可读取 :
chmod -R a+r *

数字模式

此外chmod也可以用数字来表示权限如 :

1
2
#例子
chmod 777 file

语法

1
chmod abc file

其中a,b,c各为一个数字,分别表示User、Group、及Other的权限。

r=4,w=2,x=1

若要rwx属性则4+2+1=7;
若要rw-属性则4+2=6;
若要r-x属性则4+1=5。
很有意思的一个地方,为何数字不是3,2,1,反而是4,2,1。是因为1+2=3,3=3。在解析数字对应权限的时候要对应惟一一种情况,不能出现多种情况都满足。

1
2
3
4
5
6
7
8
9
#下面两者相同
chmod a=rwx file
chmod 777 file
#下面两者相同
chmod ug=rwx,o=x file
chmod 771 file
#若用chmod 4755 filename可使此程序具有root的权限

参考文章:

Linux大全 chmod命令
Linux才叫教程 chmod命令