當咱們 chmod 777 的時候,到底幹了些什麼?

警告:杜絕使用chmod 777,尤爲是在生產環境!nginx

當咱們遇到各類權限問題的時候,例如Apache告訴你Permission dined,是否是第一時間想到chmod 777?咱們知道chmod是更改權限,那麼777究竟是什麼呢?shell

Unix權限

Unix系統的權限分三種,分別是擁有者(Owner)、用戶組(Group)、其它用戶(Other),用ls-l參數能夠查看文件的權限。ide

圖片描述

每一個項目前面那一串亂七八糟的字母和橫槓,就是權限。第一位比較簡單,指的是文件類型:-表明普通文件,d表明文件夾,Unix下文件夾是特殊的文件。後面9位分三組,每組就表明了對應用戶的權限:spa

圖片描述

  • r = 4: 讀命令行

  • w = 2: 寫code

  • x = 1: 執行blog

如今看一下上面那個圖的bin目錄,它的權限是drwxr-xr-x就能夠解讀爲:圖片

  • d: 這是個目錄資源

  • rwx: 擁有者(也就是Learning)可讀、可寫、可執行get

  • r-x: 用戶組(也就是admin)可讀、可執行、但不可寫

  • r-x: 其它用戶,跟用戶組的權限同樣

其中執行權限有什麼用呢?可能有人並不知道,好比我有個C語言寫的程序,編譯出來後是a.out,沒有執行權限的話,用./a.out命令是執行不了的。shell腳本就不同,假設我有個腳本叫install.sh,這個文件沒有執行權限,我還能夠用sh install.sh執行,可是若是加上執行權限,./install.sh就會方便不少,還能用命令行自動補全。

爲何是一、二、4?

那麼權限爲何是一、二、4呢?由於這是二進制:

  • 1: 001

  • 2: 010

  • 4: 100

這麼作最主要有兩個好處:節省空間和提高運算效率。

Unix是上個世紀60年代末期產物,當時的資源甚是寶貴,因此,只用3個bit來保存權限,是很不錯的選擇。固然CPU時間也是很寶貴,不可能爲了權限判斷讓你耗費那麼多CPU時間,因此這種二進制權限適合於位運算,位運算是衆所周知最快的,可能你們學過卻沒怎麼用過,這裏用代碼作個例子:

/**
 *     0101 (5)
 * AND 0100 (4)
 *   = 0100 (4)
 */

#define READ    4

int auth = 5; // 101, 權限是讀和寫

if (auth & READ) {
  doRead(); // 有讀權限,執行doRead()
}

這種二進制和位運算不僅用在權限上,還用在了一些配置選項裏,好比wxPython裏也有這麼用的,將多個特徵分離,須要多種樣式時,用位或構造:

slider = wx.Slider(..., style=wx.SL_VERTICAL | wx.SL_AUTOTICKS | wx.SL_LABELS )

不用 chmod 777,還能怎麼辦?

那麼遇到相似Apache的Permission denied,還有什麼辦法呢?

  1. 檢查一下父級目錄,是否是沒有權限,就算你這個目錄權限是777,而父級目錄沒權限時,也是白搭。

  2. 是否是symlink?原目錄的權限如何?

  3. 通常Apache或nginx的用戶和用戶組都是_www,想辦法讓_www擁有權限

最後再勸你們一句:不要再用chmod 777了

原文連接:http://t.cn/RtWZPbn

圖片描述

相關文章
相關標籤/搜索