Chmod

chmod是一條在Unix系統中用於控制使用者對文件的權限的命令（change mode單詞前綴的組合）和函數。只有文件所有者和超級用戶可以修改文件或目錄的權限。可以使用絕對模式（八進位數字模式），符號模式指定文件的權限。

## 用法

chmod使用語法舉例：

```
$ chmod [''options''] ''mode''[,''mode''] ''file1'' [''file2'' ...]
```

使用ls命令的查看文件或目錄的屬性

```
$ ls -l ''file''
```

### 八進位語法

chmod命令可以使用八進位數來指定權限。文件或目錄的權限位是由9個權限位來控制，每三位為一組，它們分別是文件所有者（User）的讀、寫、執行，使用者組（Group）的讀、寫、執行以及其它使用者（Other）的讀、寫、執行。歷史上，文件權限被放在一個比特掩碼中，掩碼中指定的比特位設為1，用來說明一個類具有相應的優先級。

- ｜權限｜rwx｜二進位

7｜讀 + 寫 + 執行｜rwx｜111

6｜讀 + 寫｜rw-｜110

5｜讀 + 執行｜r-x｜101

4｜只讀｜r--｜100

3｜寫 + 執行｜-wx｜011

2｜只寫｜-w-｜010

1｜只執行｜--x｜001

0｜無｜---｜000

例如， `765` 將這樣解釋：

- 所有者的權限用數字表達：屬主的那三個權限位的數字加起來的總和。如rwx，也就是4+2+1，應該是7。
- 使用者組的權限用數字表達：屬組的那個權限位數字的相加的總和。如rw-，也就是4+2+0，應該是6。
- 其它使用者的權限數字表達：其它使用者權限位的數字相加的總和。如r-x，也就是4+0+1，應該是5。

例如，修改文件myfile的權限

```
$ chmod 664 myfile
$ ls -l myfile
-rw-rw-r--  1   57 Jul  3 10:13  myfile<br />
```

### 符號模式

使用符號模式可以設置多個項目：who（使用者類型），operator（操作符）和permission（權限）,每個項目的設置可以用逗號隔開。

命令chmod將修改who指定的使用者類型對文件的訪問權限，使用者類型由一個或者多個字母在who的位置來說明,如who的符號模式表所示:

who｜使用者類型｜說明

u｜user｜文件所有者

g｜group｜文件所有者所在組

o｜others｜所有其他使用者

a｜all｜所用使用者, 相當於 ugo

operator的符號模式表:

Operator｜說明

+｜為指定的使用者類型增加權限

-｜去除指定使用者類型的權限

=｜設置指定使用者權限的設置，即將使用者類型的所有權限重新設置

permission的符號模式表:

模式｜名字｜說明

r｜讀｜設置為可讀權限

w｜寫｜設置為可寫權限

x｜執行權限｜設置為可執行權限

X｜特殊執行權限｜只有當文件為目錄文件，或者其他類型的使用者有可執行權限時，才將文件權限設置可執行

s｜setuid/gid｜當文件被執行時，根據who參數指定的使用者類型設置文件的setuid或者setgid權限

t｜粘貼位｜設置粘貼位，只有超級用戶可以設置該位，只有文件所有者u可以使用該位

例子：

chmod u+x filename 在這裡，u的意思是user指使用者本人；+的意思是增加權限；x是指文件執行權限

### 符號模式實例

對目錄的所有者u和關聯組g增加讀r和寫w權限:

```
$ '''chmod ug+rw mydir'''
$ ls -ld mydir
drw-rw----   2 unixguy  uguys  96 Dec 8 12:53 mydir
```

對文件的所有使用者ugo刪除寫w權限:

```
$ '''chmod a-w myfile'''
$ ls -l myfile
-r-xr-xr-x   2 unixguy  uguys 96 Dec 8 12:53 myfile
```

對mydir的所有者u和關聯組g設置成讀r和可執行x權限:

```
$ '''chmod ug=rx mydir'''
$ ls -ld mydir
d'''r-xr-x---'''   2 unixguy  uguys 96 Dec 8 12:53 mydir
```

### 特殊模式

參看: 文件系統權限

### 命令使用實例

命令｜說明

chmod a+r file｜給file的所有使用者增加讀權限

chmod a-x file｜刪除file的所有使用者的執行權限

chmod a+rw file｜給file的所有使用者增加讀寫權限

chmod +rwx file｜給file的所有使用者增加讀寫執行權限

chmod u=rw,go= file｜對file的所有者設置讀寫權限，清空該使用者組和其他使用者對file的所有權限（空格代表無權限）

chmod -R u+r,go-r docs｜對目錄docs和其子目錄層次結構中的所有文件給使用者增加讀權限，而對使用者組和其他使用者刪除讀權限

chmod 664 file｜對file的所有者和使用者組設置讀寫權限, 為其其他使用者設置讀權限

chmod 0755 file｜相當於u=rwx (4+2+1),go=rx (4+1 & 4+1)。0 沒有特殊模式。

chmod 4755 file｜4設置了設置使用者ID位，剩下的相當於 u=rwx (4+2+1),go=rx (4+1 & 4+1)。

find path/ -type d -exec chmod a-x {} \;｜刪除可執行權限對path/以及其所有的目錄（不包括文件）的所有使用者，使用『-type f'匹配文件

find path/ -type d -exec chmod a+x {} \;｜允許所有使用者瀏覽或通過目錄path/

## 函數說明

chmod函數C語言的定義:

```
int chmod(const char *path, mode_t mode);
```

函數使用mode_t類型的參數，使用其比特位組成各種模式:

模式｜八進位｜含義

S_ISUID｜04000｜執行時設置使用者ID,setuid權限

S_ISGID｜02000｜執行時設置組ID，setgid權限

S_ISVTX｜01000｜粘貼位

S_IRUSR, S_IREAD｜00400｜所有者讀

S_IWUSR, S_IWRITE｜00200｜所有者寫

S_IXUSR, S_IEXEC｜00100｜所有者執行

S_IRGRP｜00040｜由組讀

S_IWGRP｜00020｜由組寫

S_IXGRP｜00010｜由組執行

S_IROTH｜00004｜其他人讀

S_IWOTH｜00002｜其他人寫

S_IXOTH｜00001｜其他人執行

模式進行按位或運算對應期望的權限。

函數檢驗的錯誤以及相應的錯誤碼在man page有定義。

## 外部連結

- Linux 文件和目錄的屬性
- `chmod` — manual page from GNU coreutils.
- GNU "Setting Permissions" manual
- Solaris 9 chmod man page
- Mac OS X chmod man page, which also supports access control lists.
- CHMOD-Win 3.0 — Freeware Windows' ACL ←→ CHMOD converter.
- What CHMOD? File Permissions Calculator, web-based CHMOD calculator.
- Beginners tutorial with on-line "live" example
- chmod examples Searchable examples