警告:杜絕使用chmod 777,尤爲是在生產環境!nginx
當咱們遇到各類權限問題的時候,例如Apache告訴你Permission dined,是否是第一時間想到chmod 777
?咱們知道chmod
是更改權限,那麼777
究竟是什麼呢?shell
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呢?由於這是二進制:
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,還有什麼辦法呢?
檢查一下父級目錄,是否是沒有權限,就算你這個目錄權限是777,而父級目錄沒權限時,也是白搭。
是否是symlink?原目錄的權限如何?
通常Apache或nginx的用戶和用戶組都是_www
,想辦法讓_www
擁有權限
最後再勸你們一句:不要再用chmod 777了
原文連接:http://t.cn/RtWZPbn