作者 | learning
警告:杜絕使用chmod 777没卸,尤其是在生產(chǎn)環(huán)境羹奉!
當(dāng)我們遇到各種權(quán)限問題的時(shí)候,例如Apache告訴你Permission dined约计,是不是第一時(shí)間想到chmod 777诀拭?我們知道chmod是更改權(quán)限,那么777到底是什么呢煤蚌?
Unix權(quán)限
Unix系統(tǒng)的權(quán)限分三種耕挨,分別是擁有者(Owner)、用戶組(Group)尉桩、其它用戶(Other)筒占,用ls的-l參數(shù)可以查看文件的權(quán)限。
每個(gè)項(xiàng)目前面那一串亂七八糟的字母和橫杠蜘犁,就是權(quán)限赋铝。第一位比較簡單,指的是文件類型:-代表普通文件沽瘦,d代表文件夾革骨,Unix下文件夾是特殊的文件。后面9位分三組析恋,每組就代表了對(duì)應(yīng)用戶的權(quán)限:
r = 4: 讀
w = 2: 寫
x = 1: 執(zhí)行
現(xiàn)在看一下上面那個(gè)圖的bin目錄良哲,它的權(quán)限是drwxr-xr-x就可以解讀為:
d: 這是個(gè)目錄
rwx: 擁有者(也就是Learning)可讀、可寫助隧、可執(zhí)行
r-x: 用戶組(也就是admin)可讀筑凫、可執(zhí)行滑沧、但不可寫
r-x: 其它用戶,跟用戶組的權(quán)限一樣
其中執(zhí)行權(quán)限有什么用呢巍实?可能有人并不知道滓技,比如我有個(gè)C語言寫的程序,編譯出來后是a.out棚潦,沒有執(zhí)行權(quán)限的話令漂,用./a.out命令是執(zhí)行不了的。shell腳本就不一樣丸边,假設(shè)我有個(gè)腳本叫install.sh叠必,這個(gè)文件沒有執(zhí)行權(quán)限,我還可以用sh install.sh執(zhí)行妹窖,但是如果加上執(zhí)行權(quán)限纬朝,./install.sh就會(huì)方便很多,還能用命令行自動(dòng)補(bǔ)全骄呼。
為什么是1共苛、2、4蜓萄?
那么權(quán)限為什么是1隅茎、2、4呢绕德?因?yàn)檫@是二進(jìn)制:
1: 001
2: 010
4: 100
這么做最主要有兩個(gè)好處:節(jié)省空間和提升運(yùn)算效率。
Unix是上個(gè)世紀(jì)60年代末期產(chǎn)物摊阀,當(dāng)時(shí)的資源甚是寶貴耻蛇,所以,只用3個(gè)bit來保存權(quán)限胞此,是很不錯(cuò)的選擇臣咖。當(dāng)然CPU時(shí)間也是很寶貴,不可能為了權(quán)限判斷讓你耗費(fèi)那么多CPU時(shí)間漱牵,所以這種二進(jìn)制權(quán)限適合于位運(yùn)算夺蛇,位運(yùn)算是眾所周知最快的,可能大家學(xué)過卻沒怎么用過酣胀,這里用代碼做個(gè)例子:
/**
* 0101 (5)
* AND 0100 (4)
* = 0100 (4)
*/
#define READ 4
int auth = 5; // 101, 權(quán)限是讀和寫
if (auth & READ) {
doRead(); // 有讀權(quán)限刁赦,執(zhí)行doRead()
}
這種二進(jìn)制和位運(yùn)算不只用在權(quán)限上,還用在了一些配置選項(xiàng)里闻镶,比如wxPython里也有這么用的甚脉,將多個(gè)特征分離,需要多種樣式時(shí)铆农,用位或構(gòu)造:
slider = wx.Slider(..., style=wx.SL_VERTICAL | wx.SL_AUTOTICKS | wx.SL_LABELS )
不用 chmod 777牺氨,還能怎么辦?
那么遇到類似Apache的Permission denied,還有什么辦法呢猴凹?
檢查一下父級(jí)目錄夷狰,是不是沒有權(quán)限,就算你這個(gè)目錄權(quán)限是777郊霎,而父級(jí)目錄沒權(quán)限時(shí)沼头,也是白搭。
是不是symlink歹篓?原目錄的權(quán)限如何瘫证?
一般Apache或nginx的用戶和用戶組都是_www,想辦法讓_www擁有權(quán)限
最后再勸大家一句:不要再用chmod 777了
原文鏈接:[http://t.cn/RtWZPbn