# chmod Tham Khảo Nhanh

*Quyền file, chế độ số & ký hiệu, bit đặc biệt, umask*

> Source: chmod(1) Manual Page · MIT

## Chế Độ Số

### Chữ Số Quyền Octal

| Command | Description |
|---------|-------------|
| `4` | Đọc (r) |
| `2` | Ghi (w) |
| `1` | Thực thi (x) |
| `0` | Không có quyền |

### Định Dạng Ba Chữ Số

```
chmod 755 file    # rwxr-xr-x
chmod 644 file    # rw-r--r--
chmod 700 file    # rwx------
chmod 600 file    # rw-------
```

### Tính Toán Chữ Số

| Command | Description |
|---------|-------------|
| `7 (4+2+1)` | rwx — đọc, ghi, thực thi |
| `6 (4+2)` | rw- — đọc, ghi |
| `5 (4+1)` | r-x — đọc, thực thi |
| `4` | r-- — chỉ đọc |
| `3 (2+1)` | -wx — ghi, thực thi |
| `2` | -w- — chỉ ghi |
| `1` | --x — chỉ thực thi |
| `0` | --- — không có quyền |

## Chế Độ Ký Hiệu

### Cú Pháp: [ugoa][+-=][rwxXst]

| Command | Description |
|---------|-------------|
| `u` | User (chủ sở hữu) |
| `g` | Group |
| `o` | Others (người khác) |
| `a` | All (u + g + o) |
| `+` | Thêm quyền |
| `-` | Xóa quyền |
| `=` | Đặt quyền chính xác |

### Ví Dụ Ký Hiệu

```
chmod u+x file         # chủ sở hữu: thêm thực thi
chmod g-w file         # group: bỏ ghi
chmod o=r file         # others: chỉ đọc
chmod a+r file         # tất cả: thêm đọc
chmod u+x,g-w,o= file # thao tác kết hợp
```

## Quyền Thường Dùng

### Preset Quyền File

| Command | Description |
|---------|-------------|
| `644  rw-r--r--` | File mặc định — chủ sở hữu rw, người khác đọc |
| `755  rwxr-xr-x` | Script/binary — chủ sở hữu rwx, người khác rx |
| `600  rw-------` | File riêng tư — chỉ chủ sở hữu |
| `400  r--------` | Chỉ đọc riêng tư (SSH keys) |
| `666  rw-rw-rw-` | File ai cũng ghi được (tránh dùng) |
| `777  rwxrwxrwx` | Toàn quyền cho tất cả (tránh dùng) |

### Tham Khảo Nhanh

```
chmod 644 *.html       # web files: chủ sở hữu rw, công cộng r
chmod 755 *.sh         # scripts: chủ sở hữu rwx, công cộng rx
chmod 600 ~/.ssh/id_*  # SSH keys: chỉ chủ sở hữu
chmod 400 secret.pem   # certificate: chỉ đọc
```

## Quyền Thư Mục

### Ý Nghĩa Quyền Với Thư Mục

| Command | Description |
|---------|-------------|
| `r (4)` | Liệt kê nội dung thư mục (`ls`) |
| `w (2)` | Tạo/xóa file trong thư mục |
| `x (1)` | Truy cập (cd vào) thư mục |
| `rx (5)` | Liệt kê + truy cập (thông thường để đọc) |
| `rwx (7)` | Toàn quyền |

### Quyền Thư Mục Thường Dùng

```
chmod 755 dir/     # chuẩn: chủ sở hữu rwx, người khác rx
chmod 700 dir/     # riêng tư: chỉ chủ sở hữu
chmod 750 dir/     # group truy cập: chủ sở hữu rwx, group rx
chmod 1777 /tmp    # sticky bit: chỉ chủ sở hữu mới xóa được
```

## Bit Đặc Biệt

### Setuid, Setgid, Sticky

| Command | Description |
|---------|-------------|
| `Setuid (4xxx)` | Chạy với quyền của chủ sở hữu file (vd: `passwd`) |
| `Setgid (2xxx)` | Chạy với group của file / kế thừa group thư mục |
| `Sticky (1xxx)` | Chỉ chủ sở hữu mới xóa được file (vd: `/tmp`) |

### Đặt Bit Đặc Biệt

```
chmod 4755 program     # setuid: -rwsr-xr-x
chmod 2755 dir/        # setgid: drwxr-sr-x
chmod 1755 dir/        # sticky: drwxr-xr-t
chmod u+s program      # setuid dạng ký hiệu
chmod g+s dir/         # setgid dạng ký hiệu
chmod +t dir/          # sticky bit dạng ký hiệu
```

## Đệ Quy

### Thay Đổi Quyền Đệ Quy

```
chmod -R 755 dir/           # đặt tất cả thành 755 đệ quy
chmod -R u+rwX dir/         # chủ sở hữu rw, +x chỉ cho thư mục
chmod -R go-w dir/          # bỏ quyền ghi của group/others
```

### File vs Thư Mục với find

```
# đặt thư mục thành 755, file thành 644
find /path -type d -exec chmod 755 {} +
find /path -type f -exec chmod 644 {} +
```

### X Hoa — Thực Thi Có Điều Kiện

| Command | Description |
|---------|-------------|
| `x (thường)` | Thêm thực thi cho tất cả file và thư mục |
| `X (hoa)` | Thêm thực thi chỉ cho thư mục và file đã có thực thi |

## umask

### Cách umask Hoạt Động

| Command | Description |
|---------|-------------|
| `umask` | Hiển thị umask hiện tại |
| `umask 022` | Files: 644, Dirs: 755 |
| `umask 077` | Files: 600, Dirs: 700 |
| `umask 002` | Files: 664, Dirs: 775 |

### Tính Toán umask

```
# quyền mặc định trừ umask = quyền thực tế
# Files:  666 - 022 = 644 (rw-r--r--)
# Dirs:   777 - 022 = 755 (rwxr-xr-x)
umask          # hiển thị umask hiện tại
umask 022      # mặc định thường dùng
umask -S       # hiển thị dạng ký hiệu
```

## Các Pattern Thường Gặp

### Tình Huống Hằng Ngày

| Command | Description |
|---------|-------------|
| `Web root` | `chmod -R 755 /var/www/html` |
| `File cấu hình` | `chmod 600 app.conf` |
| `Thư mục SSH` | `chmod 700 ~/.ssh` |
| `SSH authorized_keys` | `chmod 600 ~/.ssh/authorized_keys` |
| `Thư mục chia sẻ` | `chmod 2775 /shared` (setgid) |
| `Log files` | `chmod 640 /var/log/app.log` |
| `Cron scripts` | `chmod 755 /etc/cron.daily/myjob` |
| `Thư mục tạm` | `chmod 1777 /tmp` (sticky) |

### Xem Quyền

```
ls -l file.txt       # xem quyền
ls -ld dir/          # xem quyền thư mục
stat -c '%A %a %n' * # ký hiệu + số + tên
getfacl file.txt     # xem ACL (nếu đang dùng)
```
