不管是Linux新手還是高手,在使用它的時候不可避免都會遇到Linux權限問題。而這些問題也是初學者問得最多的問題,很多的腳本不能執行的原因就是因為沒有設定正确的權限所緻。這裡我們來看看Linux下的根限到底是怎麼一回事。
當你建立一個檔案時,它的最初的權限取決于你的umask值(将在後面說明)。權限可以使用chmod指令或是chmod()系統調用來修改一個檔案的權限模式。隻有在檔案所有者才能修改檔案的權限模式。唯一例外的就是超級使用者:超級使用者可以修改任何檔案的權限。下面是chmod指令的格式:
chmod [-Rfh] [agou] [+-=] [rwxXstugol] filelist
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiInBnauQlRiZUN2EDM1gTOxITMfhDNxUjNvw1Ny8CX4ADOwAjMvwFduVWboNWY0RXYvwVbvNmLvR3YxUjLzM3Lc9CX6MHc0RHaiojIsJye.jpg)
字元 | 含義 |
a | 修改所有使用者的特權 |
g | 修改組使用者的特權 |
o | 修改其它使用者的特權 |
u | 修改所有者的權限 |
執行什麼操作:
- | 删除目前的權限 |
= | 替換目前的權限 |
+ | 增加目前的權限 |
要修改哪一項權限:
r | 讀通路 |
w | 寫通路 |
x | 執行通路 |
s | SUID或是SGID |
t | 粘附位 |
其中X是表示由BSD衍生出來的UNIX系統特有的選項,它的意思是:如果檔案是一個目錄,或有一些其它執行位已設定,那麼就将檔案設定為隻可執行。而l則是由System V衍生出來的UNX系統特有的選項,它的意思是:允許對檔案進行強制加鎖。
-R選項表示chmod指令會遞歸執行。如果指定了一個目錄filelist,那麼目錄的權限改變了,目錄下所有檔案的權限也都改變了。如果該目錄包含子目錄,那麼這一地程會一直向下重複。
-f選項表示強制執行,chmod指令不會報告錯誤。通常在shell中比較有用。
在某些系統中使用-h選項來改變chmod對符号連結的工作方式。如果指定了-h選項,而其中一個參資料為符号連結的話,那麼chmod不會改變符号連結所指向的那個檔案或目錄的權限。
下圖說明了指令的使用方法:
計算機八進制的檔案權限:
chmod允許使用者使用一個四位八進制數字來指定檔案權限模式。使用者可以通過将權限相加的方式來計算這一數值。下表說明了每個檔案權限對應的八進制數。
八進制數 | 權限 |
4000 | SUID |
2000 | SGID |
1000 | |
0400 | 所有者可讀 |
0200 | 所有者可寫 |
0100 | 所有者可執行 |
0040 | 組成員可讀 |
0020 | 組成員可寫 |
0010 | 組成員可執行 |
0004 | 其它使用者可讀 |
0002 | 其它使用者可寫 |
001 | 其它使用者可執行 |
是以,一個檔案權限如果為“-rwxr-x---”,那麼其檔案模式為0750,計算過程為:0400+0200+0100+0040+0010=0750。例如常見的/tmp目錄的權限就為1777,表示任何使用者都可以在該目錄下建立檔案,但是使用者不能删除其它使用者的檔案。
umask
umask是“使用者檔案建立模式掩碼”的縮寫,是一個四位的八進制數值。用來确定一個新建立檔案的權限。每個程序都從父程序那裡繼承了自己的umask。一般該指令會在.bashrc,.profile,.cshrc或是/etc/profile及/etc/bashrc中。
最常見的umask值是022,027以及077。022讓檔案所有者擁有對建立檔案的讀寫權限,但是其它人對此隻讀。例如:0666(預設的檔案建立模式)+0022(umask)=0644。計算umask值最簡單的方法是記住:umask值中的2屏蔽了寫權限,而7屏蔽了讀,寫及執行權限。
常用的umask設定:
使用者通路 | 組通路 | 其它 | |
0000 | 所有 | ||
讀,執行 | |||
0007 | 無 | ||
0022 | |||
0027 | |||
0077 |
下面的圖檔是顯示建立檔案後的權限,大家可以想想看它對應的mask應是多少。
粘附位:
具有八進制值1000的位叫粘附位,是unix已經發展得不再需要的事物而又不能擺脫其追随的例子.像unix在其上度過它的孩童期的PDP-11/70這樣的小記憶體系統,需要一些程式持續地駐留在記憶體或交換裝置上這個時候粘附位就十分重要了.在今天由于有了25美圓的記憶體子產品和快速磁盤驅動器,在可執行程式上的粘附位已經過時了,現代的核心已經悄然地忽略了它.
如果在目錄上設定了這個位,那麼大多數版本的unix不允許删除或重新命名該目錄中的檔案,除非你是該目錄的屬主,該檔案的屬主或超級使用者.在這個目錄上擁有寫入權限是不夠的.這相約定是讓像/tmp之類的目錄變得多少有些隐私性和安全性的一種嘗試.
Solaris和HP-UX在處理粘附位目錄的時候并不那麼嚴格.如果對該目錄有寫入權限,即使不是屬主,也能删除其中的檔案.這實際上有許多意義,雖然對實際應用幾乎沒有什麼影響。
SUID和SGID
setuid和setgid的位值是04000和02000。這些位允許程式通路運它們的使用者本來無權通路的檔案和程序。當某個目錄上設定setgid位時,在這個目錄中新建立的檔案具有該目錄的屬組權而不是建立該檔案的使用者的預設屬組。這項約定使得在幾個使用者之間(隻要這些使用者都屬于同一個組)共享一個目錄中的檔案變得更簡單。在使用這些特性之前,請檢查自己的系統,因為并不是所有版本的unix都支援這個特性,當然BSD,REDHAT,HP-UX,SOLARIS都是支援的。對setgid位的這種解釋跟它在可執行檔案上設定時的含義沒有什麼關系,但不要混淆了這兩種意義。一些系統允許在非可執行的純文字檔案上設定setgid位,以在該檔案被打開時請求特殊的鎖定。有關它的詳細說明可以參考:[url]http://www.linuxeden.com/html/unix/20071031/36892.html[/url]。在linux下,有關SUID最常用的一個指令就是ping,下面是關于它的圖檔,好好看看吧。
如果對windows比較熟悉的人應對“runas”這個指令不會陌生,我個人覺得SUID及SGID和它有點類似,不過比它要更先進一點。runas允許非特權使用者可以用管理者的使用者來臨時運作特殊的應用程式。不過這個指令在個人計算機上用得比較少,倒是在伺服器上用得多一點。使用它在一定的程度可以增加安全性。
怎麼樣,有了一個相對直覺的概念了吧,當然這裡隻是簡單的列出這些,更深入的技術還需要過一步的學習和了解。