permission mode 是存在於 inode block 裡的 12 個 bit.
當 bit 為 0 時表示關, 1 表示開, 如:
110111101101
若這 12 bit 分開4組的話, 分別為如下內容:
1) suid, sgid, sticky_bit
2) owner_read, owner_write, owner_exectue
3) group_read, group_write, group_exectue
4) others_read, others_write, others_exectue
按前例來算的, 被打開的 permission 有:
suid, sgid (110)
owner_read, owner_write, owner_exectue (111)
group_read, group_exectue (101)
others_read, others_exectue (101)
不過, 在操作上, 我們不不會用 2 進位啦, 一般(視程式而別)可使用 8 進位或 text mode :
110111101101換算為 8 進位就是 6755 了.
這個相對簡單多了, 我們可用 bc 來算算看:
echo "obase=8;ibase=2;110111101101" | bc
echo "obase=2;ibase=8;6755" | bc
如果手頭上沒有 bc 或其它工具可用, 那也可用如下的換算表來對照:
000|0
001|1
010|2
011|3
100|4
101|5
110|6
111|7
分別將 12 bit 拆四組來算就是了...(考筆試時最好用了!)
然而, 換算成 text mode 就沒那麼輕鬆了.
是因為 text mode 上只能用 9 個字母去表示 12 個 bit .
需花些心思還是可以的.
可先從最簡單的右邊 9 個 bit 來算起:
111101101
rwxr-xr-x
不難發現每組都是 rwx , 1 對著就寫相應的 text, 0 就寫 - 了.
再下來分別找到那三個 x 的位置, 因為:
suid 若為 1 會修改 owner_x: 以 s 代替 x, 以 S 代替 - .
sgid 若為 1 會修改 group_x: 以 s 代替 x, 以 S 代替 - .
sticky_bit 若為 1 會改 others_x: 以 t 代替 x, 以 T 代替 - .
簡單來說, 若原來的 x 為 1 , 就是小寫, 為 0 則是大寫.
以上例來說, 最後結果將是:
110111101101
rwsr-sr-x
至於 umask 運算, 也是可從 permission bit 來運算的.
先抓出 directory 的 default mode: 0777
及 file 的 default mode: 0666
然後將 umask bit 的 1 所對的位置設為 0 就是了.
以 umask 0123 為例吧, 換為 2 進為就是:
000001010011
對應 new file 的 0666:
000110110110
結果, 凡是 umask 1 的位置都設為 0, 得:
000110100100
再轉回 8 進位就是:
0644
若你簡單用減法來算的話, 是不對的:
0666
-0123
-------
0543 (000101100011)
真的公式可參考這個:
(bitwise_NOT umask) AND default_mode = new_permission
上例:
(bitwise_NOT 0123) AND 0666 = 0644
計算過程如下:
000001010011
bitwise_NOT 得:
111110101100
AND
000110110110
得:
000110100100
換算為 8 進位, 就是:
0644
用 2 進位來算是最接近電腦思維的方法, 也是最準確的.
只是人們一般不習慣 2 進位思維而已, 一旦熟悉之後就萬變不離其宗了!
阅读(802) | 评论(0) | 转发(0) |