在 linux 中,每個檔案都有唯一的「所屬者」(user)和「所屬群組」(group)。owner 和 group 都對檔案有特殊的許可權
輸入ls -l
,就可以詳細檢視每個檔案的許可權屬性。
我們可以看到,使用者名稱和群組名可以是相同的。一個群組可以只包含一個使用者,也可以包含多個使用者。
ls -l
的第一行一定是一個長度為10的字串:drwxr-xr-x
其中第1位表明檔案的型別,常見如-
表示一般檔案,d
表示目錄,l
表示連結;
第 2-4 位表示所屬者的許可權,形如rwx
,r 代表可讀,w 代表可寫,x 代表可執行。
可讀代表可以開啟檔案檢視內容,可寫代表可以修改檔案內容,可執行則代表這個檔案可不可以裝載到記憶體中執行。在 linux 中,檔案能否裝載執行不取決於字尾名,而取決於有無 x 許可權,即使讓給一個文字檔案加上 x 許可權後,你也能用命令執行它(雖然執行結果肯定是失敗)。
第 5-7 為表示所屬群組的許可權,也就是這個檔案所屬群組裡的人(除了 user)對他的許可權。r-x
表示可讀可執行,但不可寫。
第 8-10 為其他人(others)的許可權,也就是除了 user 和 group 中使用者以外的其他人。
而這些許可權都不受 root 限制,root 就是萬能的神,可以隨意操作任何檔案。
更改檔案許可權的命令有chgrp, chown 和 chmod。這三個命令往往需要 root 來執行。
chgrp 即「change group」,可以修改檔案的群組:
chgrp root a.cpp # 修改a.cpp的群組為 root
chgrp -R mygroup myfolder # 修改myfolder和其中所有檔案的群組
chown 改變檔案的所屬者。同時 chown 也可以改變檔案的群組,兼任的 chgrp 的功能。
chown root a.cpp # 修改a.cpp的群組為 root
chown myuser:mygroup a.cpp # 修改a.cpp所屬者為myuser,群組為mygroup
chown :mygroup a.cpp # 只修改a.cpp群組為mygroup
chmod 修改檔案的許可權(即那個長度10的字串),有兩種使用方式。
常用的用法是將每一個rwx的r記為4、w記為2,x記為1,這樣rwx就是一個0-7之間的數位,用三個數位就組成了檔案的許可權。比如 5 代表 r-x,7 代表 rwx,而 0 代表 ---。
chmod 777 a.cpp # a.cpp對 owner group others的許可權都是rwx
chmod 755 a.cpp # a.cpp對 owner 的許可權是rwx,對 group 和 others 的許可權是r-x
除此之外,也可以直接用 rwx 字串來修改許可權,u 代表 user,g 代表 group,o 代表 others,a 則代表全部。加號,減號與等號都可以賦值。
chmod u=rwx,go=rx a.cpp # u修改為rwx g和o修改為r-x
chmod a+x a.cpp # 所有許可權全部加上x,r和w許可權不變
chmod a-w a.cpp # 所有許可權全部去掉w
之前提到的 rwx 許可權都是針對檔案了,那對於目錄來說,rwx的意義會有哪些不同呢?在 linux 裡,我們不要只目錄理解成「資料夾」,而把目錄也當成一種特殊的檔案,這個檔案的內容就是目錄下的檔案資訊,這樣就好理解了。
對於目錄來說,r 代表你能否讀取目錄下的檔案列表(即是否可以用 ls 列出裡面的檔案);w 代表是否可以更改目錄下的檔案列表(也就是在目錄下新建,刪除,移動和更名),x 則代表能否進入這個目錄。
目錄的許可權非常重要!如果我的主目錄下有一個 root 所屬的資料夾:
drwxr--r-- 2 root root 4096 1月 16 12:45 root/
「我」對於這個目錄是 others,因此只有 r 許可權。但我不能cd root
,也不能開啟 root 下的檔案,因為沒有 x 許可權。所以無權操作目錄,只有 r 沒有 x的目錄就像一個不能執行的二進位制檔案。r 許可權沒有起到實質作用。
另一方面,假設如果我的主目錄下有一個 root 所屬的檔案:
drwx------ 2 root root 4096 1月 16 12:45 rootfile
「我」對於這個目錄是 others,因此只有沒有許可權。但我對~
目錄有完整的rwx
許可權,所以雖然我不能開啟,也不能修改檔案,我卻可以直接刪掉他!檔案能否開啟修改取決於自己的許可權,但能否被移動刪除等則取決於目錄的許可權。
我們檢視/tmp
和/usr/bin/passwd
的許可權,就會發現原來還有rws
和rwt
許可權
drwxrwxrwt 3 root root 4096 1月 16 15:42 /tmp
-rwsr-xr-x 1 root root 59976 3月 14 2022 /usr/bin/passwd
位於所有者許可權的 x 替換為 s 就叫做SUID許可權,這個許可權具有以下的性質:執行程式的人需要有 x 許可權才能執行(那是廢話),但在執行途中將獲得 owner 的許可權。
這個許可權有什麼意義呢?就以/usr/bin/passwd
作為例子,他是用來修改密碼的,而密碼資訊儲存在/etc/shadow
裡面,而 shadow 儲存著使用者資訊這樣機密的內容,他的許可權是"-rw-r-----",也就是說我連開啟都不行。可使用者修改密碼也並不需要 root 許可權。這就是因為 passwd 命令是 rws,當我執行他時,我就暫時獲得了 root 的許可權,可以修改密碼。
另一個例子就是 sudo 命令,用 ls 檢視 sudo ,它的許可權是"rwsr-xr-x",任何使用者都可以執行他,在執行他的期間就暫時獲得了 root 許可權。sudo 這個命令本身就是理解 SUID 的最佳方式
位於所屬群組許可權的 x 替換為 s 就叫做 SGID 許可權,與 SUID 相似,執行程式的人可以獲得群組的支援。
SGID 也可以用於目錄,當進入一個 SGID 的目錄,在該目錄下新建的所有檔案都會以目錄的群組作為群組。
SBIT 許可權則僅用於目錄。others 許可權為rwt
表示 SBIT 許可權,在 SBIT 的許可權的資料夾裡,所有人都可以建立檔案,但建立的檔案只有自己才能刪除,其他使用者無法刪除。/tmp
就是 SBIT 應用的典型,所有人都可以建立檔案,但只能刪除自己的檔案,而不能刪除其他使用者建立的。
這三個許可權怎麼設定呢?記 SUID, SGID, SBIT 分別為 421,又可以得到一個 0-7 的數位,把這個數位加在原來的3位數位前,變成4位元就可以了。或者通過字串設定也可以。
chmod 4755 a.out # rwxr-xr-x
chmod u+s a.out # SBIT
當我們新建立一個檔案,他的 user 和 group 預設都是你自己,那預設的 rwx 許可權是什麼呢?這就取決於使用者的 umask。
輸入umask,可以得到一個4位元字串:
$ umask
0022
$ touch f1
$ mkdir f2
$ ls-d f1 f2
-rw-r--r-- 1 ofnoname ofnoname 0 1月 16 17:14 f1
drwxr-xr-x 2 ofnoname ofnoname 4096 1月 16 17:14 f2
0022 表示的的是「被拿掉的許可權」,022自然表示「user 不拿許可權,而 group 和 other 預設被去掉 w 許可權」。目錄檔案預設是777,因此結果是 rwxr-xr-x,而普通檔案預設是666(沒有 x),因此結果是rwxr-xr-x。
(摘自《鳥哥的linux私房菜 基礎篇》)
rwx 許可權是所有 linux 都擁有的基礎許可權。除此之外,rwx在很多時候還不夠滿足需求,特定的檔案系統還支援很多其他有用的屬性。
chattr [+-=][ASacdistu] 檔案或目錄名稱
選項與引數:
+ :增加某一個特殊引數,其他原本存在引數則不動。
- :移除某一個特殊引數,其他原本存在引數則不動。
= :設定一定,且僅有後面接的引數
A :當設定了 A 這個屬性時,若你有存取此檔案(或目錄)時,他的存取時間 atime 將不會被修改,
可避免 I/O 較慢的機器過度的存取磁碟。(目前建議使用檔案系統掛載引數處理這個專案)
S :一般檔案是非同步寫入磁碟的(原理請參考[前一章sync](../Text/index.html#sync)的說明),如果加上 S 這個屬性時,
當你進行任何檔案的修改,該更動會「同步」寫入磁碟中。
a :當設定 a 之後,這個檔案將只能增加資料,而不能刪除也不能修改資料,只有root 才能設定這屬性
c :這個屬性設定之後,將會自動的將此檔案「壓縮」,在讀取的時候將會自動解壓縮,
但是在儲存的時候,將會先進行壓縮後再儲存(看來對於大檔案似乎蠻有用的!)
d :當 dump 程式被執行的時候,設定 d 屬性將可使該檔案(或目錄)不會被 dump 備份
i :這個 i 可就很厲害了!他可以讓一個檔案「不能被刪除、改名、設定連結也無法寫入或新增資料!」
對於系統安全性有相當大的助益!只有 root 能設定此屬性
s :當檔案設定了 s 屬性時,如果這個檔案被刪除,他將會被完全的移除出這個硬碟空間,
所以如果誤刪了,完全無法救回來了喔!
u :與 s 相反的,當使用 u 來設定檔案時,如果該檔案被刪除了,則資料內容其實還存在磁碟中,
可以使用來救援該檔案喔!
注意這些屬性並非在任何系統上都有支援。lsattr可以列出這些隱藏屬性。