linux 基礎(2)檔案許可權及其修改

Ofnoname發表於2023-01-16

檔案的許可權屬性

在 linux 中,每個檔案都有唯一的“所屬者”(user)和“所屬群組”(group)。owner 和 group 都對檔案有特殊的許可權

輸入ls -l,就可以詳細檢視每個檔案的許可權屬性。

image

我們可以看到,使用者名稱和群組名可以是相同的。一個群組可以只包含一個使用者,也可以包含多個使用者。

rwx 許可權

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

chgrp 即“change group”,可以修改檔案的群組:

chgrp root a.cpp # 修改a.cpp的群組為 root
chgrp -R mygroup myfolder # 修改myfolder和其中所有檔案的群組

chown

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

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 許可權都是針對檔案了,那對於目錄來說,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許可權,所以雖然我不能開啟,也不能修改檔案,我卻可以直接刪掉他!檔案能否開啟修改取決於自己的許可權,但能否被移動刪除等則取決於目錄的許可權。

rws 和 rwt 特殊許可權

我們檢視/tmp/usr/bin/passwd的許可權,就會發現原來還有rwsrwt許可權

drwxrwxrwt 3 root root 4096  1月 16 15:42 /tmp
-rwsr-xr-x 1 root root 59976  3月 14  2022 /usr/bin/passwd

SUID 許可權

位於所有者許可權的 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 的最佳方式

SGID 許可權

位於所屬群組許可權的 x 替換為 s 就叫做 SGID 許可權,與 SUID 相似,執行程式的人可以獲得群組的支援。

SGID 也可以用於目錄,當進入一個 SGID 的目錄,在該目錄下新建的所有檔案都會以目錄的群組作為群組。

SBIT 許可權

SBIT 許可權則僅用於目錄。others 許可權為rwt表示 SBIT 許可權,在 SBIT 的許可權的資料夾裡,所有人都可以建立檔案,但建立的檔案只有自己才能刪除,其他使用者無法刪除。/tmp就是 SBIT 應用的典型,所有人都可以建立檔案,但只能刪除自己的檔案,而不能刪除其他使用者建立的。

這三個許可權怎麼設定呢?記 SUID, SGID, SBIT 分別為 421,又可以得到一個 0-7 的數字,把這個數字加在原來的3位數字前,變成4位就可以了。或者透過字串設定也可以。

chmod 4755 a.out # rwsr-xr-x
chmod u+s a.out # SBIT

umask 預設屬性

當我們新建立一個檔案,他的 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),因此結果是rw-r--r--。

*檔案目錄的隱藏許可權

(摘自《鳥哥的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可以列出這些隱藏屬性。

相關文章