權限簡介
- Linux系統上對檔案的權限有着嚴格的控制,用于如果相對某個檔案執行某種操作,必須具有對應的權限方可執行成功。
- Linux下檔案的權限類型一般包括讀,寫,執行。對應字母為 r、w、x。 Python系列教程,免費擷取,遇到bug及時回報,讨論交流可加扣裙<60 61 15 02 7>
- Linux下權限的粒度有 擁有者 、群組 、其它組 三種。每個檔案都可以針對三個粒度,設定不同的rwx(讀寫執行)權限。通常情況下,一個檔案隻能歸屬于一個使用者群組, 如果其它的使用者想有這個檔案的權限,則可以将該使用者加入具備權限的群組,一個使用者可以同時歸屬于多個組。
- Linux上通常使用chmod指令對檔案的權限進行設定和更改。
一、快速入門
更改檔案權限 (chmod指令)
一般使用格式
chmod [可選項] <mode> <file...>

範例:
- 設定所有使用者可讀取檔案 a.conf
- 設定 c.sh 隻有 擁有者可以讀寫及執行
- 設定檔案 a.conf 與 b.xml 權限為擁有者與其所屬同一個群組 可讀寫,其它組可讀不可寫
- 設定目前目錄下的所有檔案與子目錄皆設為任何人可讀寫
數字權限使用格式
在這種使用方式中,首先我們需要了解數字如何表示權限。 首先,我們規定 數字 4 、2 和 1表示讀、寫、執行權限(具體原因可見下節權限詳解内容),即 r=4,w=2,x=1 。此時其他的權限組合也可以用其他的八進制數字表示出來,如: rwx = 4 + 2 + 1 = 7 rw = 4 + 2 = 6 rx = 4 +1 = 5 即
若要同時設定 rwx (可讀寫運作) 權限則将該權限位 設定 為 4 + 2 + 1 = 7 若要同時設定 rw- (可讀寫不可運作)權限則将該權限位 設定 為 4 + 2 = 6 若要同時設定 r-x (可讀可運作不可寫)權限則将該權限位 設定 為 4 +1 = 5
上面我們提到,每個檔案都可以針對三個粒度,設定不同的rwx(讀寫執行)權限。即我們可以用用三個8進制數字分别表示 擁有者 、群組 、其它組( u、 g 、o)的權限詳情,并用chmod直接加三個8進制數字的方式直接改變檔案權限。文法格式為 :
chmod <abc> file...
範例:
- 設定所有人可以讀寫及執行
- 設定擁有者可讀寫,其他人不可讀寫執行
更改檔案擁有者(chown指令)
linux/Unix 是多人多工作業系統,每個的檔案都有擁有者(所有者),如果我們想變更檔案的擁有者(利用 chown 将檔案擁有者加以改變),一般隻有系統管理者(root)擁有此操作權限,而普通使用者則沒有權限将自己或者别人的檔案的擁有者設定為别人。
文法格式:
chown [可選項] user[:group] file...
範例:
- 設定檔案 d.key、e.scrt的擁有者設為 users 群體的 tom
- 設定目前目錄下與子目錄下的所有檔案的擁有者為 users 群體的 James
二、Linux權限詳解
Linux系統上對檔案的權限有着嚴格的控制,用于如果相對某個檔案執行某種操作,必須具有對應的權限方可執行成功。這也是Linux有别于Windows的機制,也是基于這個權限機智,Linux可以有效防止病毒自我運作,因為運作的條件是必須要有運作的權限,而這個權限在Linux是使用者所賦予的。
Linux的檔案權限有以下設定:
- Linux下檔案的權限類型一般包括讀,寫,執行。對應字母為 r、w、x。
- Linux下權限的屬組有 擁有者 、群組 、其它組 三種。每個檔案都可以針對這三個屬組(粒度),設定不同的rwx(讀寫執行)權限。
- 通常情況下,一個檔案隻能歸屬于一個使用者群組, 如果其它的使用者想有這個檔案的權限,則可以将該使用者加入具備權限的群組,一個使用者可以同時歸屬于多個組。
- 如果我們要表示一個檔案的所有權限詳情,有兩種方式:
- 第一種是十位二進制表示法,(三個屬組每個使用二進制位,再加一個最高位共十位),可簡化為三位八進制形式
- 另外一種十二位二進制表示法(十二個二進制位),可簡化為四位八進制形式
-
十位權限表示
常見的權限表示形式有:
後九位解析: 我們知道Linux權限總共有三個屬組,這裡我們給每個屬組使用三個位置來定義三種操作(讀、寫、執行)權限,合起來則是權限的後九位。 上面我們用字元表示權限,其中 -代表無權限,r代表讀權限,w代表寫權限,x代表執行權限。
實際上,後九位每個位置的意義(代表某個屬組的某個權限)都是固定的,如果我們将各個位置權限的有無用二進制數 1和 0來代替,則隻讀、隻寫、隻執行權限,可以用三位二進制數表示為
轉換成八進制數,則為 r=4, w=2, x=1, -=0(這也就是用數字設定權限時為何是4代表讀,2代表寫,1代表執行)
實際上,我們可以将所有的權限用二進制形式表現出來,并進一步轉變成八進制數字:
由上可以得出,每個屬組的所有的權限都可以用一位八進制數表示,每個數字都代表了不同的權限(權值)。如 最高的權限為是7,代表可讀,可寫,可執行。
故 如果我們将每個屬組的權限都用八進制數表示,則檔案的權限可以表示為三位八進制數
關于第一位最高位的解釋: 上面我們說到了權限表示中後九位的含義,剩下的第一位代表的是檔案的類型,類型可以是下面幾個中的一個:
十二位權限(Linux附權重限)
附權重限相關概念
linux除了設定正常的讀寫操作權限外,還有關于一類設定也是涉及到權限,叫做Linxu附權重限。包括 SET位權限(suid,sgid)和粘滞位權限(sticky)。
SET位權限:suid/sgid是為了使“沒有取得特權使用者要完成一項必須要有特權才可以執行的任務”而産生的。 一般用于給可執行的程式或腳本檔案進行設定,其中SUID表示對屬主使用者增加SET位權限,SGID表示對屬組内使用者增加SET位權限。執行檔案被設定了SUID、SGID權限後,任何使用者執行該檔案時,将獲得該檔案屬主、屬組賬号對應的身份。在許多環境中,suid 和 sgid 很管用,但是不恰當地使用這些位可能使系統的安全遭到破壞。是以應該盡量避免使用SET位權限程式。(passwd 指令是為數不多的必須使用“suid”的指令之一)。
- suid(set User ID,set UID)的意思是程序執行一個檔案時通常保持程序擁有者的UID。然而,如果設定了可執行檔案的suid位,程序就獲得了該檔案擁有者的UID。
- sgid(set Group ID,set GID)意思也是一樣,隻是把上面的程序擁有者改成程序組就好了。
-
如果一個檔案被設定了suid或sgid位,會分别表現在所有者或同組使用者的權限的可執行位上;如果檔案設定了suid還設定了x(執行)位,則相應的執行位表示為s(小寫)。但是,如果沒有設定x位,它将表示為S(大寫)。如:
SET位權限表示形式(10位權限):
設定方式:
SET位權限可以通過chmod指令設定,給檔案加suid和sgid的指令如下(類似于上面chmod賦予一般權限的指令):
粘滞位權限:
粘滞位權限即sticky。一般用于為目錄設定特殊的附權重限,當目錄被設定了粘滞位權限後,即便使用者對該目錄有寫的權限,也不能删除該目錄中其他使用者的檔案資料。設定了粘滞位權限的目錄,是用ls檢視其屬性時,其他使用者權限處的x将變為t。 使用chmod指令設定目錄權限時,+t、-t權限模式可分别用于添加、移除粘滞位權限。
粘滞位權限表示形式(10位權限):
一個檔案或目錄被設定了粘滞位權限,會表現在其他組使用者的權限的可執行位上。如果檔案設定了sticky還設定了x(執行)位,其他組使用者的權限的可執行位為t(小寫)。但是,如果沒有設定x位,它将表示為T(大寫)。如:
設定方式:
sticky權限同樣可以通過chmod指令設定:
chmod +t <檔案清單..>
十二位的權限表示方法
附權重限除了用十位權限形式表示外,還可以用用十二位字元表示。
SGT分别表示SUID權限、SGID權限、和 粘滞位權限,這十二位分别對應關系如下:
第11位為SUID位,第10位為SGID位,第9位為sticky位,第8-0位對應于上面的三組rwx位(後九位)。
在這十二位的每一位上都置值。如果有相應的權限則為1, 沒有此權限則為0。
如果将則前三位SGT也轉換成一個二進制數,則
- suid 的八進制數字是4
- sgid 的代表數字是 2
- sticky 位代表數字是1
- 這樣我們就可以将十二位權限三位三位的轉化為4個八進制數。其中
- 最高的一位八進制數就是suid,sgdi,sticky的權值。
- 第二位為 擁有者的權值
- 第三位為 所屬組的權值
-
最後一位為 其他組的權值
附權重限的八進制形式
通過上面,我們知道,正常權限和附權重限可以用4位八進制數表示。類似于正常權限的數字權限指派模式(使用三位八進制數字指派)
-
chmod <abc> file...
我們可以進一步使用4位八進制數字同時指派正常權限和附權重限。
chmod <sabc> file...
其中s是表示附權重限的把八進制數字,abc與之前一緻,分别是對應User、Group、及Other(擁有者、群組、其他組)的權限。因為SUID對應八進制數字是4,SGID對于八進制數字是2,則“4755”表示設定SUID權限,“6755”表示同時設定SUID、SGID權限。
我們進一步将上小節的例子中的二進制數轉變為八進制表示形式,則
對比範例:
- 設定 netlogin 的權限為擁有者可讀寫執行,群組和其他權限為可讀可執行
- 設定 netlogin 的權限為擁有者可讀寫執行,群組和其他權限為可讀可執行,并且設定suid
chmod 4755與chmod 755對比多了附權重限值4,這個4表示其他使用者執行檔案時,具有與所有者同樣的權限(設定了SUID)。
為什麼要設定4755 而不是 755? 假設netlogin是root使用者建立的一個上網認證程式,如果其他使用者要上網也要用到這個程式,那就需要root使用者運作chmod 755 netlogin指令使其他使用者也能運作netlogin。但假如netlogin執行時需要通路一些隻有root使用者才有權通路的檔案,那麼其他使用者執行netlogin時可能因為權限不夠還是不能上網。這種情況下,就可以用 chmod 4755 netlogin 設定其他使用者在執行netlogin也有root使用者的權限,進而順利上網。
在 Linux 指令中,
chmod
用于
修改檔案或者目錄的權限。對于檔案或者目錄的普通權限,共有 3 種,分别為:
-
:讀取;r
-
:寫入;w
-
:執行。x
- 此外,還有 3 種特殊權限,分别為:
-
:Set User ID;suid
-
:Set Group ID;sgid
-
:粘滞位。sticky
- 在此,我們僅介紹如何利用
chmod
修改檔案及目錄的普通權限。
權限範圍及代号
檔案及目錄的權限範圍,包括:
-
:User,即檔案或目錄的擁有者;u
-
:Group,即檔案或目錄的所屬群組;g
-
:Other,除了檔案或目錄擁有者或所屬群組之外,其他使用者皆屬于這個範圍;o
-
:All,即全部的使用者,包含擁有者、所屬群組以及其他使用者。a
- 權限的代号包括:
-
:讀取權限,數字代号為r
;4
-
:寫入權限,數字代号為w
;2
-
:執行或切換權限,數字代号為x
;1
-
:不具任何權限,數字代号為 ;-
-
:當檔案被執行時,根據s
參數指定的使用者類型設定檔案的who
或者setuid
權限。setgid
- 文法及選項說明
-
文法:chmod
-
chmod [-cfRv][--help][--version][<權限範圍>+/-/=<權限設定...>][檔案或目錄...]
-
chmod [-cfRv][--help][--version][數字代号][檔案或目錄...]
-
chmod [-cfRv][--help][--reference=<參考檔案或目錄>][--version][檔案或目錄...]
-
- 選項說明:
-
或-c
:效果類似--changes
參數,但僅傳回更改的部分;-v
-
或-f
或--quiet
:不顯示錯誤資訊;--silent
-
或-R
:遞歸處理,将指定目錄下的所有檔案及子目錄一并處理;--recursive
-
或-v
:顯示指令執行過程;--verbose
-
:顯示線上幫助資訊;--help
-
:把指定檔案或目錄的權限全部設成和參考檔案或目錄的權限相同;--reference=<參考檔案或目錄>
-
:顯示版本資訊;--version
-
:開啟權限範圍的檔案或目錄的該項權限設定;<權限範圍>+<權限設定>
-
:關閉權限範圍的檔案或目錄的該項權限設定;<權限範圍>-<權限設定>
-
:指定權限範圍的檔案或目錄的該項權限設定。<權限範圍>=<權限設定>
-
-
示例
首先,我們通過
指令來看看檔案及目錄的相關資訊:ls -l
如上圖所示,以其為例,我們依次來分析各内容代表的含義,
- 第 1 行:
,表示所列出内容的磁盤占用空間總和值,機關為total 16
;KB
- 第 1 列:
,表示檔案或目錄的類型及權限;dr-xr-x-r-x
- 第 2 列:
,表示檔案或目錄的連結個數;4
- 第 3 列:
,表示檔案或目錄的所有者;bin.guo
- 第 4 列:
,表示檔案或目錄的所在群組;staff
- 第 5 列:
,表示檔案或目錄本身的大小;136
- 第 6 列:
,表示檔案或目錄的最後更新時間;Nov 24 11:26
- 第 7 列:
,表示檔案或目錄的名稱。a
- 其中 第 1 列 的内容(除
外)特别豐富,以total
為例(共 10 個字元),我們對其進一步分析:dr-xr-x-r-x
- 第 1 個字元
,表示檔案或目錄的類型,其類型包括d
-
,表示命名管道檔案;p
-
,表示目錄檔案;d
-
,表示符号連接配接檔案;l
-
,表示普通檔案;-
-
,表示 Socket 檔案;s
-
,表示字元裝置檔案;c
-
,表示塊裝置檔案。b
-
- 第 2 ~ 4 個字元
,表示檔案或目錄的所有者權限;r-x
- 第 5 ~ 7 個字元
,表示檔案或目錄的所有者同組使用者權限;r-x
- 第 8 ~ 10 個字元
,表示檔案或目錄的其他使用者權限。r-x
- 此外,大家可能還注意到有些檔案或目錄在其顯示的權限後面還跟着一個字元,或者為
或者為.
,具體:@
- 在 Mac 終端中顯示為
@
- 在 Linux 系統中顯示為
.
- 這表示其所屬的檔案或目錄開啟了
SELinux
安全上下文标簽,如果沒有,則表示未開啟。
接下來,示範一些具體的操作示例:
- 示例 1 :添加所有使用者對
的執行權限test-one
- 示例 2 :取消
所有者群組使用者的執行權限及其他使用者的寫入權限test-one
- 示例 3 :遞歸取消檔案夾
的所有使用者的執行權限a
- 示例 4 :添加所有使用者對
的所有權限test-one
- 示例 5 :取消
所有者的執行權限及其他使用者的所有權限test-one