使用chmod来改变权限位
这一命令有符号模式和绝对模式。
符号模式
chmod命令的一般格式为:
chmod [who] operator [permission] filename
w h o的含义是:
代码: 全选
1. u 文件属主权限。
2. g 属组用户权限。
3. o 其他用户权限。
4. a 所有用户(文件属主、属组用户及其他用户)。
o p e r a t o r的含义:
代码: 全选
1. + 增加权限。
2. - 取消权限。
3. = 设定权限。
p e r m i s s i o n的含义:
代码: 全选
1. r 读权限。
2. w 写权限。
3. x 执行权限。
4. s 文件属主和组set-ID。
5. t 粘性位*。
6. l 给文件加锁,使其他用户无法访问。
7. u,g,o 针对文件属主、属组用户及其他用户的操作。
8.
9. *在列文件或目录时,有时会遇到“ t”位。“t”代表了粘性位。如果在一个目录上出现“t”位,这就意味着该目录中的文件只有其属主才可以删除,即使某个属组用户具有和属主同等的权限。不过有的系统在这一规则上并不十分严格。
创建一个文件后,会同时创建一个inode和一个block,inode存放的是文件的属性信息,但是不包括文件名,并存放所对应数据所在的 block块的地址的指针;block存放文件的数据,每个block最多存放一个文件,而当一个block存放不下的情况下,会占用下一个block。
linux里文件的文件名、文件属性、文件内容是分别存储的:文件名存放在目录项(即dentry)中,文件属性存放在inode中,一般情况下,每个inode占用1024 byte,即128字节的磁盘空间文件内容存放在数据块中。
inode 的內容在記錄檔案的屬性以及該檔案實際資料是放置在哪幾號 block 內! 基本上,inode 記錄的檔案資料至少有底下這些:
* 該檔案的存取模式(read/write/excute);
* 該檔案的擁有者與群組(owner/group);
* 該檔案的容量;
* 該檔案建立或狀態改變的時間(ctime);
* 最近一次的讀取時間(atime);
* 最近修改的時間(mtime);
* 定義檔案特性的旗標(flag),如 SetUID...;
* 該檔案真正內容的指向 (pointer);
inode 的數量與大小也是在格式化時就已經固定了
permission mode 是存在於 inode 裡的 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 進位思維而已, 一旦熟悉之後就萬變不離其宗了!