概览
文件权限管理是Linux/Unix中很基础也很重要的概念,而网上大多充斥着粗制滥造的迷之操作误人子弟让人不忍直视,索性在此记录并与大家分享。
本文提及的Linux命令适用于绝大多数Linux/Unix发行版,如Ubuntu,CentOS, Fedora,Arch,苹果MacOS,Raspberry
Pi,或者其他bash环境,如Git bash等等。
环境
Windows 10 21H1 + Linux子系统Ubuntu 20 LTS + Windows Terminal,本文提及的所有操作都再此环境下运行,如果您使用的是MacOS或者任何Linux发行版,直接运行操作系统中的terminal亦可。
打开Windows Terminal,运行命令wsl进入Linux子系统:
* PS - PowerShell
* C:\Users\neo - 当前所在Windows目录
* WSL - Windows Subsystem for Linux
* neo - Linux主机当前登录用户
* @ - At,在
* workstation - Linux主机名
* :/mnt/c/Users/neo - Linux当前目录
* $ - 当前用户是一个普通用户,root用户会显示为#
neo@workstation:/mnt/c/Users/neo$ 这个完整的解释是:普通用户neo在workstation主机中的/mnt/c/Users/neo目录下
运行cd ~进入home目录,开始我们的探索之旅
*~ - home目录
*pwd - print working directory,打印工作目录(当前所在目录)
*/home/neo – 用户neo的home目录
准备些素材
使用命令mkdir新建一个目录’folder’,使用命令touch新建文件’file’,使用命令ln
-s建立一个软连接’link’并指向目录’folder’,最后使用命令ls -l或者ll命令确认
* mkdir – make directory 建立目录
* ln – link,-s symbolic,建立符号链接(软链接)
* ls – list,-l list,以列表的方式列出文件和目录,同ll命令(list list)
简单说明一下这个列表,独占一行的‘total’是当前目录内所有文件所占磁盘空间的总和(KB),它下面的列表我们分成七列来看:
第一列:就是本文所述的重点,文件属性(模式)列表
第二列:文件的硬链接数量,1代表此文件有1个硬链接,就是文件本身,可使用ln新建一个硬链接指向文件file,再次通过ls -l命令查看,两个文件在此的数值都变为了2;根据发行版的不同会有差异,当前文件如果是目录的话会显示其包含子目录的个数
第三列:owner,文件所有者的用户名
第四列:group,文件所在组的组名
第五列:文件大小(以字节为单位,byte,b)
第六列:文件修改时间,格式为‘月,日,时:分’
第七列:文件名,颜色显示依据不同终端主题和样式会有差别
文件属性
第一列的文件属性列表,我们可以继续拆分成四列来看:
首列标识了文件的类型,分别解释如下:
‘-‘: 此文件是一个普通文件
‘d’: directory, 此文件是一个目录,目录也是一个特殊的文件,它存放着其他文件或目录
‘l’:link,此文件是一个软链接文件
除了以上常见的三种文件标识,还有诸如c,b,p等特殊文件标识,日常工作中很少用到,这里就不细说了,感兴趣的小伙伴可以另行查阅。
在首列文件类型列之后,密密麻麻的有9个字母或横线组成了一串字符,我们把这9个字符拆分为3组,每组3个字符:
从左至右分别为:
第一组:user,用户,即owner,文件所属的用户,对此文件的权限都有哪些
第二组:group,组,文件所属的组内所包含的用户,对此文件的权限都有哪些
第三组:other,其他用户,除了此文件所有者和此文件所属组内用户的其他用户,对此文件的权限都有哪些。
每组对应的文件权限又分配有三个属性,r,w,x,并且三个属性的位置是固定不变的,即r永远在最左侧,w永远在最中间,x永远在最右侧。如果某个属性被禁用,则以横杠‘-’代替。三个属性分别为:
r:read,可读
w:write,可写
x:execute,可执行
-:none,没有
回到我们刚才查看的文件列表,可以很清楚3个文件的权限配置:
文件’file’:
-rw-r--r-- 1 neo neo 0 Jul 31 19:31 file
这是一个普通文件,允许它的所有者用户neo读和写,但不允许执行;对名为neo的组内所有用户成员,允许他们可读,但不允许修改和执行;对既不是它的拥有者neo也不是neo组内成员的其他用户,允许读取,但不允许修改和执行。
文件’folder’:
drwxr-xr-x 1 neo neo 512 Jul 31 19:31 folder
这是一个文件夹,为它的所有者用户neo开放所有权限; 对名为neo的组内所有用户成员和其他用户,允许他们读取和执行,但不允许修改。
文件’folder’:
lrwxrwxrwx 1 neo neo 6 Jul 31 19:31 link -> folder
这是一个链接,允许所有用户读取,修改和执行。
chown修改文件所有者
文件的持有者可以通过命令chown改变,比如更改文件file的持有者从neo到smith,此命令如果是普通用户执行的话需要在命令前面加sudo:
sudo chown smith file
chown:change owner,更改持有者
sudo:SuperUser DO,超级用户做,指的是root用户
chown命令也可以同时修改用户和组,以‘用户名:组名’的形式:
sudo chown neo:neo file
chgrp修改文件所在组
文件的所在组可以通过命令chgrp改变,比如更改文件file的组从neo到matrix,此命令如果是普通用户执行的话需要在命令前面加sudo:
sudo chgrp matrix file
chgrp:change group,更改用户组
chmod修改文件权限
我们使用命令chmod修改文件权限。官方给出的文档用法是这样的:
Each MODE is of the form'[ugoa]*([-+=]([rwxXst]*|[ugo]))+|[-+=][0-7]+'.
下面的用法是我自己整理的,用着比较简便:
chmod [ugoa][+-=][rwx] [-R]path/filename
*chmod - change file mode bits 修改文件模式位
[ugoa]
u:user,用户,为文件所有者修改权限
例:为文件所有者添加可读权限chmod u+r file
g:group,组,为文件所在组修改权限
例:为文件所在组添加可读权限chmod g+r file
o:other,其他用户
例:为其他用户添加可读权限chmod o+r file
a:all, 全部,等同于ugo,为文件所有者,组和其他用户全部修改权限
例:为所有用户添加可读权限chmod a+r file
ugoa也可以随意组合,比如为用户组和其他用户移除可写权限chmod go-w file
[+-=]
+:添加权限
-:移除权限
=:使权限相同,为文件所有者,组或者其他用户,按照指定的所有者,组或者其他用户,或者指定的rwx权限,分配相同的文件权限
例:修改组权限为文件所有者相同的权限,修改前的组权限为r--, 修改后为rwx,见下图:
[rwx]
r:read,可读
w:write,可写(修改)
x:execute,可执行
rwx也可随意组合,例如,设置允许其他用户可读并且可写 chmod o+rw file, 再例如设置移除组和其他用户的可写和执行权限chmodgo-wx file
[-R]
递归的生效于目标目录下的所有子目录和文件
修改文件’file’的权限,为其所有者neo增加执行权限:
执行命令:chmod u+x file,再次执行命令ls -l确认修改结果
我们发现相比之前该文件的权限,经过更改后在用户组中多出了一个x,变为了rwx;其他两组没变,依然是r--
更快捷的方法
如果打开chmod --help,这个命令的man手册有一条用法:
chmod [OPTION]... OCTAL-MODE FILE...
Octal-mode:八进制模式,此模式分别为r, w, x分配了权重数值,即:
r: 4
w: 2
x: 1
回到我们最初新建的3个文件,用八进制标识权限分别为644,755,777:
所以chmod命令可作用于更加快捷的权限分配。例如修改file文件,使得它的持有者可读可写(4+2+0=6),组只可读可写(4+2+0=6),其他用户只可读(4+0+0=4):
chmod 664 file
一个文件的最高权限是777,即文件所有者,组和其他用户都有读,写和执行的权限,相当于ugo+rwx。
好多文件权限问题是文件持有者和组的问题,而不要上来就粗暴的给777,当作是玩水果机呢,即使你的环境非常安全,但也是一个很不好的习惯。
网友评论