概覽
?
文件權(quán)限管理是Linux/Unix中很基礎(chǔ)也很重要的概念,而網(wǎng)上大多充斥著粗制濫造的迷之操作誤人子弟讓人不忍直視,索性在此記錄并與大家分享。
本文提及的Linux命令適用于絕大多數(shù)Linux/Unix發(fā)行版,如Ubuntu,CentOS, Fedora,Arch,蘋果MacOS,Raspberry
Pi,或者其他bash環(huán)境,如Git bash等等。
?
環(huán)境
Windows 10 21H1 + Linux子系統(tǒng)Ubuntu 20 LTS + Windows Terminal,本文提及的所有操作都再此環(huán)境下運行,如果您使用的是MacOS或者任何Linux發(fā)行版,直接運行操作系統(tǒng)中的terminal亦可。
打開Windows Terminal,運行命令wsl進入Linux子系統(tǒng):

* PS - PowerShell
* C:\Users\neo - 當(dāng)前所在Windows目錄
* WSL - Windows Subsystem for Linux
* neo - Linux主機當(dāng)前登錄用戶
* @ - At,在
* workstation - Linux主機名
* :/mnt/c/Users/neo - Linux當(dāng)前目錄
* $ - 當(dāng)前用戶是一個普通用戶,root用戶會顯示為#
neo@workstation:/mnt/c/Users/neo$ 這個完整的解釋是:普通用戶neo在workstation主機中的/mnt/c/Users/neo目錄下

運行cd ~進入home目錄,開始我們的探索之旅
*~ - home目錄
*pwd - print working directory,打印工作目錄(當(dāng)前所在目錄)
*/home/neo – 用戶neo的home目錄
準(zhǔn)備些素材
使用命令mkdir新建一個目錄’folder’,使用命令touch新建文件’file’,使用命令ln
-s建立一個軟連接’link’并指向目錄’folder’,最后使用命令ls -l或者ll命令確認(rèn)

* mkdir – make directory 建立目錄
* ln – link,-s symbolic,建立符號鏈接(軟鏈接)
* ls – list,-l list,以列表的方式列出文件和目錄,同ll命令(list list)
簡單說明一下這個列表,獨占一行的‘total’是當(dāng)前目錄內(nèi)所有文件所占磁盤空間的總和(KB),它下面的列表我們分成七列來看:

第一列:就是本文所述的重點,文件屬性(模式)列表
第二列:文件的硬鏈接數(shù)量,1代表此文件有1個硬鏈接,就是文件本身,可使用ln新建一個硬鏈接指向文件file,再次通過ls -l命令查看,兩個文件在此的數(shù)值都變?yōu)榱?;根據(jù)發(fā)行版的不同會有差異,當(dāng)前文件如果是目錄的話會顯示其包含子目錄的個數(shù)
第三列:owner,文件所有者的用戶名
第四列:group,文件所在組的組名
第五列:文件大小(以字節(jié)為單位,byte,b)
第六列:文件修改時間,格式為‘月,日,時:分’
第七列:文件名,顏色顯示依據(jù)不同終端主題和樣式會有差別
文件屬性
?
第一列的文件屬性列表,我們可以繼續(xù)拆分成四列來看:

首列標(biāo)識了文件的類型,分別解釋如下:
‘-‘: 此文件是一個普通文件
‘d’: directory, 此文件是一個目錄,目錄也是一個特殊的文件,它存放著其他文件或目錄
‘l’:link,此文件是一個軟鏈接文件
除了以上常見的三種文件標(biāo)識,還有諸如c,b,p等特殊文件標(biāo)識,日常工作中很少用到,這里就不細(xì)說了,感興趣的小伙伴可以另行查閱。
在首列文件類型列之后,密密麻麻的有9個字母或橫線組成了一串字符,我們把這9個字符拆分為3組,每組3個字符:

從左至右分別為:
第一組:user,用戶,即owner,文件所屬的用戶,對此文件的權(quán)限都有哪些
第二組:group,組,文件所屬的組內(nèi)所包含的用戶,對此文件的權(quán)限都有哪些
第三組:other,其他用戶,除了此文件所有者和此文件所屬組內(nèi)用戶的其他用戶,對此文件的權(quán)限都有哪些。
每組對應(yīng)的文件權(quán)限又分配有三個屬性,r,w,x,并且三個屬性的位置是固定不變的,即r永遠(yuǎn)在最左側(cè),w永遠(yuǎn)在最中間,x永遠(yuǎn)在最右側(cè)。如果某個屬性被禁用,則以橫杠‘-’代替。三個屬性分別為:
r:read,可讀
w:write,可寫
x:execute,可執(zhí)行
-:none,沒有
回到我們剛才查看的文件列表,可以很清楚3個文件的權(quán)限配置:
文件’file’:
-rw-r--r--?1? neo? neo?0? Jul? 31?19:31? file
這是一個普通文件,允許它的所有者用戶neo讀和寫,但不允許執(zhí)行;對名為neo的組內(nèi)所有用戶成員,允許他們可讀,但不允許修改和執(zhí)行;對既不是它的擁有者neo也不是neo組內(nèi)成員的其他用戶,允許讀取,但不允許修改和執(zhí)行。
文件’folder’:
drwxr-xr-x?1? neo? neo?512? Jul? 31?19:31? folder
這是一個文件夾,為它的所有者用戶neo開放所有權(quán)限; 對名為neo的組內(nèi)所有用戶成員和其他用戶,允許他們讀取和執(zhí)行,但不允許修改。
文件’folder’:
lrwxrwxrwx?1? neo? neo?6? Jul? 31?19:31? link -> folder
這是一個鏈接,允許所有用戶讀取,修改和執(zhí)行。
chown修改文件所有者
文件的持有者可以通過命令chown改變,比如更改文件file的持有者從neo到smith,此命令如果是普通用戶執(zhí)行的話需要在命令前面加sudo:
sudo chown smith file

chown:change owner,更改持有者
sudo:SuperUser DO,超級用戶做,指的是root用戶
chown命令也可以同時修改用戶和組,以‘用戶名:組名’的形式:
sudo chown neo:neo file

chgrp修改文件所在組
文件的所在組可以通過命令chgrp改變,比如更改文件file的組從neo到matrix,此命令如果是普通用戶執(zhí)行的話需要在命令前面加sudo:
sudo chgrp matrix file

chgrp:change group,更改用戶組
chmod修改文件權(quán)限
我們使用命令chmod修改文件權(quán)限。官方給出的文檔用法是這樣的:
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,用戶,為文件所有者修改權(quán)限
例:為文件所有者添加可讀權(quán)限chmod u+r file
g:group,組,為文件所在組修改權(quán)限
例:為文件所在組添加可讀權(quán)限chmod g+r file
o:other,其他用戶
例:為其他用戶添加可讀權(quán)限chmod o+r file
a:all, 全部,等同于ugo,為文件所有者,組和其他用戶全部修改權(quán)限
例:為所有用戶添加可讀權(quán)限chmod a+r file
ugoa也可以隨意組合,比如為用戶組和其他用戶移除可寫權(quán)限chmod go-w file
[+-=]
+:添加權(quán)限
-:移除權(quán)限
=:使權(quán)限相同,為文件所有者,組或者其他用戶,按照指定的所有者,組或者其他用戶,或者指定的rwx權(quán)限,分配相同的文件權(quán)限
例:修改組權(quán)限為文件所有者相同的權(quán)限,修改前的組權(quán)限為r--, 修改后為rwx,見下圖:

[rwx]
r:read,可讀
w:write,可寫(修改)
x:execute,可執(zhí)行
rwx也可隨意組合,例如,設(shè)置允許其他用戶可讀并且可寫 chmod o+rw file, 再例如設(shè)置移除組和其他用戶的可寫和執(zhí)行權(quán)限chmodgo-wx file
[-R]
遞歸的生效于目標(biāo)目錄下的所有子目錄和文件
修改文件’file’的權(quán)限,為其所有者neo增加執(zhí)行權(quán)限:
執(zhí)行命令:chmod u+x file,再次執(zhí)行命令ls -l確認(rèn)修改結(jié)果

我們發(fā)現(xiàn)相比之前該文件的權(quán)限,經(jīng)過更改后在用戶組中多出了一個x,變?yōu)榱藃wx;其他兩組沒變,依然是r--
更快捷的方法
如果打開chmod --help,這個命令的man手冊有一條用法:
chmod [OPTION]... OCTAL-MODE FILE...
Octal-mode:八進制模式,此模式分別為r, w, x分配了權(quán)重數(shù)值,即:
r: 4
w: 2
x: 1
回到我們最初新建的3個文件,用八進制標(biāo)識權(quán)限分別為644,755,777:

所以chmod命令可作用于更加快捷的權(quán)限分配。例如修改file文件,使得它的持有者可讀可寫(4+2+0=6),組只可讀可寫(4+2+0=6),其他用戶只可讀(4+0+0=4):
chmod 664 file

一個文件的最高權(quán)限是777,即文件所有者,組和其他用戶都有讀,寫和執(zhí)行的權(quán)限,相當(dāng)于ugo+rwx。
好多文件權(quán)限問題是文件持有者和組的問題,而不要上來就粗暴的給777,當(dāng)作是玩水果機呢,即使你的環(huán)境非常安全,但也是一個很不好的習(xí)慣。