Quyền Truy Cập: User, Group và chmod
Trên Linux nhiều người dùng chung một máy, nên mỗi file có quyền quyết định ai được đọc, ghi, chạy nó. Hiểu cơ chế này là bắt buộc để làm việc trên server — và nó cũng là nguồn của lỗi "Permission denied" mà ai cũng từng gặp. Bài này mổ xẻ nó.
Đọc chuỗi quyền
ls -l cho thấy quyền của mỗi file ở đầu dòng:
touch f.sh
ls -l f.sh
-rw-r--r-- 1 root root 0 May 23 09:09 f.sh
Chuỗi -rw-r--r-- gồm 10 ký tự, giải mã như sau:
- rw- r-- r--
│ └┬┘ └┬┘ └┬┘
│ │ │ └── other (mọi người khác): r-- = chỉ đọc
│ │ └────── group (thành viên nhóm): r-- = chỉ đọc
│ └────────── user (chủ file): rw- = đọc + ghi
└───────────── loại: - file, d thư mục, l symlink (Bài 2)
- Ký tự đầu: loại file (Bài 2).
- Chín ký tự còn lại chia làm ba nhóm ba: quyền cho user (chủ), group (nhóm), other (còn lại).
- Mỗi nhóm có ba quyền theo thứ tự cố định: r (read), w (write), x (execute); dấu
-nghĩa là không có quyền đó.
r, w, x nghĩa là gì
Ý nghĩa khác nhau giữa file và thư mục — đây là chỗ hay nhầm:
| Với file | Với thư mục | |
|---|---|---|
| r | đọc nội dung file | liệt kê được file bên trong (ls) |
| w | sửa nội dung file | tạo/xóa file bên trong |
| x | chạy file (như chương trình) | đi vào thư mục (cd) được |
Lưu ý quan trọng: với thư mục, x không phải "thực thi" mà là "được đi vào". Một thư mục không có x thì bạn không cd vào được, dù có r. Và để xóa một file, bạn cần w trên thư mục chứa nó, không phải trên file.
Ký pháp octal: vì sao 755, 644...
Mỗi quyền ứng với một giá trị số: r = 4, w = 2, x = 1. Cộng lại được con số cho mỗi nhóm:
r w x = 4+2+1 = 7 (đọc, ghi, chạy)
r w - = 4+2 = 6 (đọc, ghi)
r - x = 4+0+1 = 5 (đọc, chạy)
r - - = 4 = 4 (chỉ đọc)
- - - = 0 = 0 (không quyền)
Ba con số liên tiếp = quyền cho user/group/other. Vì vậy:
- 644 =
rw-r--r--: chủ đọc/ghi, còn lại chỉ đọc. (Quyền điển hình của file thường.) - 755 =
rwxr-xr-x: chủ toàn quyền, còn lại đọc/chạy. (Điển hình của thư mục và script/chương trình.) - 600 =
rw-------: chỉ chủ đọc/ghi, người khác không gì. (Cho file nhạy cảm như khóa SSH — Bài 14.)
Đổi quyền: chmod
Hai cách viết, cùng kết quả.
Cách octal — đặt thẳng con số:
chmod 754 f.sh
ls -l f.sh # -rwxr-xr--
chmod 600 f.sh
ls -l f.sh # -rw-------
Cách symbolic — cộng/trừ quyền cho từng nhóm, dễ đọc khi chỉ đổi một quyền:
chmod u+x f.sh # thêm x cho user (u)
chmod g-w f.sh # bỏ w của group (g)
chmod o=r f.sh # đặt other (o) đúng bằng r
chmod a+r f.sh # a = all (u+g+o), thêm r cho tất cả
Trong đó: u user, g group, o other, a all; + thêm, - bỏ, = đặt đúng bằng. Dùng octal khi đặt trọn bộ quyền, symbolic khi chỉ chỉnh một quyền.
Một tình huống kinh điển — script không chạy được:
echo "echo hello" > run.sh
./run.sh
bash: ./run.sh: Permission denied
Vì file mới tạo không có quyền x. Thêm vào:
chmod +x run.sh
./run.sh # hello
Đây là lý do bạn luôn chmod +x cho script trước khi chạy nó (Bài 16).
Đổi chủ sở hữu: chown
chown đổi user/group sở hữu file (thường cần quyền root — Bài 12):
chown alice file.txt # đổi chủ thành alice
chown alice:dev file.txt # đổi chủ thành alice, nhóm thành dev
chown -R alice:dev /var/app # -R: đệ quy cả thư mục
Bạn dùng chown nhiều khi triển khai: ví dụ cho web server (chạy bằng user www-data) sở hữu thư mục mã nguồn.
Quyền hiện tại của bạn: id
id
uid=0(root) gid=0(root) groups=0(root)
id cho biết bạn là user nào (uid), nhóm chính (gid), và các nhóm khác. Quyền của bạn với một file phụ thuộc bạn là chủ, thuộc nhóm, hay "other". (root — uid 0 — bỏ qua mọi kiểm tra quyền, nên nó nguy hiểm; Bài 12.)
umask: quyền mặc định khi tạo file
Vì sao file mới luôn là 644 còn thư mục là 755? Do umask — một "mặt nạ" lấy đi quyền khỏi giá trị mặc định:
umask
0022
umask 022 nghĩa là "bỏ quyền w của group và other". Hệ thống bắt đầu từ 666 (file) / 777 (thư mục) rồi trừ umask, ra 644 / 755. Bạn hiếm khi đổi umask, nhưng biết nó giải thích vì sao file mới có quyền như vậy.
Quyền đặc biệt (biết để khỏi bỡ ngỡ)
Ngoài rwx còn ba bit đặc biệt bạn sẽ thấy đôi lúc:
- setuid (
sở chỗ x của user) — chạy file với quyền của chủ file, không phải người chạy. Ví dụpasswdcần setuid để user thường đổi được mật khẩu. - setgid — tương tự cho group; trên thư mục thì file mới kế thừa group của thư mục.
- sticky bit (
t) — trên thư mục như/tmp, chỉ chủ file mới xóa được file của mình (dù thư mục cho ghi chung).
Bạn ít khi tự đặt chúng, nhưng khi thấy rwsr-xr-x hay /tmp có t ở cuối thì biết đó là gì.
🧹 Dọn dẹp
cd /tmp && rm -f f.sh g.txt run.sh noexec.sh
Tổng kết
Mỗi file có quyền r/w/x cho ba nhóm user/group/other, đọc qua chuỗi ls -l. Quyền biểu diễn bằng octal (r=4, w=2, x=1 → 644, 755, 600...). Đổi bằng chmod (octal đặt trọn bộ, symbolic chỉnh từng quyền), đổi chủ bằng chown, và umask quyết định quyền mặc định. Nhớ: với thư mục, x là "đi vào được", và xóa file cần quyền w trên thư mục cha. Phần lớn lỗi "Permission denied" được giải bằng cách đọc đúng chuỗi quyền này.
Bài 8 (cũng là deep-dive) chuyển sang thứ đang chạy trên hệ thống: tiến trình và tín hiệu — cách xem, quản lý, và kết thúc chúng.