chmod Là Gì và Dùng Để Làm Gì?
chmod (change mode) là lệnh Linux và Unix dùng để đặt ai được đọc, ghi và thực thi một tệp hoặc thư mục. Mỗi tệp có ba bộ quyền: một cho chủ sở hữu (owner), một cho nhóm (group) và một cho mọi người còn lại (others). Công cụ ở trên chuyển chín ô đánh dấu đó thành con số hoặc chữ cái mà chmod cần, và ngược lại.
Bạn có thể đưa mode cho chmod theo hai cách: dưới dạng số octal, như chmod 755 script.sh, hoặc ở dạng symbolic, như chmod u+x script.sh. Chỉ chủ sở hữu tệp hoặc root mới đổi được quyền của tệp.

Cách Phân Quyền Tệp Trên Linux Hoạt Động
Mỗi quyền có một giá trị: đọc (read) = 4, ghi (write) = 2 và thực thi (execute) = 1. Cộng chúng lại cho từng lớp để có một chữ số từ 0 đến 7, rồi viết ba chữ số theo thứ tự: chủ sở hữu, nhóm, người khác. Vậy rwx là 4+2+1 = 7, r-x là 4+0+1 = 5, và rwxr-xr-x là 755.
Chạy ls -l, bạn sẽ thấy điều tương tự dưới dạng chữ cái, ví dụ -rwxr-xr-x. Ký tự đầu tiên là loại tệp (- cho tệp thông thường, d cho thư mục, l cho liên kết tượng trưng), theo sau là ba nhóm rwx cho chủ sở hữu, nhóm và người khác. Dấu gạch ngang nghĩa là quyền đó bị tắt.
Các chữ cái mang ý nghĩa hơi khác nhau với tệp và với thư mục:
Tệp: mở và đọc nội dung. Thư mục: liệt kê tên các mục bên trong bằng ls.
Tệp: thay đổi nội dung. Thư mục: tạo, xóa và đổi tên tệp bên trong (việc này cũng cần quyền thực thi trên thư mục). Xóa một tệp phụ thuộc vào quyền ghi của thư mục, không phải của tệp.
Tệp: chạy như một chương trình hoặc script. Thư mục: vào thư mục bằng cd và mở các tệp bên trong theo tên. Có quyền đọc mà không có quyền thực thi, bạn liệt kê được tên trong thư mục nhưng không mở được gì bên trong.
u là chủ sở hữu tệp, g là nhóm của tệp và o là mọi người còn lại. Linux chỉ áp dụng lớp đầu tiên khớp với bạn: nếu bạn là chủ sở hữu, quyền của nhóm và người khác không áp dụng cho bạn, kể cả khi chúng cho phép nhiều hơn.
Advertisement
Các Quyền chmod Phổ Biến và Khi Nào Nên Dùng
Các mode này bao quát gần như mọi trường hợp thực tế. Hầu hết cũng có sẵn dưới dạng nút preset trong công cụ.
Mặc định cho hầu hết tệp: trang web, hình ảnh và tệp cấu hình không chứa bí mật. Chủ sở hữu sửa được, những người khác chỉ đọc được.
Mặc định cho thư mục và cho chương trình hay script mà ai cũng được chạy. Chỉ chủ sở hữu mới thay đổi được.
Chỉ chủ sở hữu đọc hoặc ghi được. Dùng cho SSH private key, tệp .env, API token và mọi thứ chứa mật khẩu.
Chỉ chủ sở hữu mở hoặc liệt kê được thư mục. Chuẩn cho ~/.ssh và thư mục script cá nhân.
Chủ sở hữu sửa, một nhóm (ví dụ nhóm của web server) đọc, và không ai khác thấy được tệp.
Chủ sở hữu có toàn quyền, nhóm mở và đọc được thư mục, còn người khác bị chặn hoàn toàn.
Cả chủ sở hữu và nhóm đều sửa được. Phổ biến trên máy chủ làm việc nhóm, nơi nhiều người dùng chung một group.
Chủ sở hữu và nhóm tạo và xóa được tệp bên trong; người khác chỉ xem được.
Chỉ chủ sở hữu đọc được và không ai ghi được. AWS yêu cầu bạn chạy chmod 400 cho key pair .pem đã tải về trước khi dùng nó với SSH.
Mọi người dùng và tiến trình trên máy đều đọc, thay đổi và chạy được. Hầu như không bao giờ là cách sửa đúng, như phần tiếp theo giải thích.
chmod 755, 644 và 777 Khác Nhau Thế Nào?
755 và 644 chỉ khác nhau ở bit thực thi: 755 cho phép mọi người chạy tệp hoặc mở thư mục, 644 thì không. Đó là lý do quy tắc thông thường là thư mục 755, tệp 644: thư mục cần quyền thực thi để mọi người vào được, còn phần lớn tệp không bao giờ nên được chạy.
777 cấp quyền ghi cho mọi tài khoản trên máy, kể cả người dùng của web server. Nếu bất kỳ website hay script nào trên máy chủ bị xâm nhập, kẻ tấn công có thể thay đổi hoặc thay thế tệp của bạn, chèn mã độc vào trang hoặc cài backdoor. Khi gặp lỗi "Permission denied", cách sửa đúng thường là đặt lại chủ sở hữu (chown) hoặc nhóm cho đúng, không phải 777.
Quyền khuyến nghị cho các trường hợp phổ biến nhất:
Tệp website (HTML, PHP, hình ảnh):
644. Thư mục website:755. Đây là mức WordPress và hầu hết bảng điều khiển hosting khuyến nghị.wp-config.php và các tệp khác chứa mật khẩu cơ sở dữ liệu: WordPress đề xuất
440hoặc400để người dùng khác trên máy chủ không đọc được.600hoặc640cũng giữ tệp riêng tư mà vẫn cho chủ sở hữu sửa.Thư mục upload hoặc cache mà web server cần ghi vào: cấp quyền ghi cho nhóm của web server (
775) hoặc đặt người dùng của web server làm chủ sở hữu, thay vì dùng777.Thư mục ~/.ssh:
700. Private key (id_ed25519,id_rsa):600hoặc400. authorized_keys:600. Public key (.pub):644.Shell script bạn muốn chạy:
755, hoặc700nếu chỉ mình bạn được chạy.chmod +x script.shthêm quyền thực thi mà không đụng đến các bit khác.
Advertisement
Sửa Lỗi "Permissions 0644 are too open" Với SSH Key
SSH bỏ qua private key mà người dùng khác đọc được và in ra WARNING: UNPROTECTED PRIVATE KEY FILE! kèm theo Permissions 0644 for '/home/you/.ssh/id_rsa' are too open. Chạy chmod 600 ~/.ssh/id_rsa (hoặc chmod 400) rồi kết nối lại. Ở phía máy chủ, với thiết lập mặc định StrictModes yes, SSH daemon cũng bỏ qua authorized_keys nếu tệp đó, ~/.ssh hoặc thư mục home của bạn cho phép nhóm hoặc người khác ghi.
Nếu quyền đã đúng mà kết nối vẫn thất bại, hãy kiểm tra xem port 22 có mở không trên máy chủ.
Quyền Đặc Biệt: Setuid, Setgid và Sticky Bit
Một chữ số thứ tư đứng đầu bổ sung ba bit đặc biệt: 4 = setuid, 2 = setgid và 1 = sticky. Chúng được cộng lại giống các quyền khác, nên 6755 là setuid cộng setgid. Trong ls -l, chúng thế chỗ chữ cái thực thi: s ở vị trí chủ sở hữu hoặc nhóm, t ở vị trí người khác.
Một điểm đặc thù của Linux: GNU chmod 755 dir (và chmod 0755 dir) giữ nguyên bit setuid hoặc setgid đang có trên một thư mục. Để xóa nó, hãy chỉ định rõ bằng chmod g-s dir (hoặc chmod a-s dir cho cả hai bit), hoặc dùng năm chữ số: chmod 00755 dir.
Chương trình có setuid chạy với quyền của chủ sở hữu thay vì quyền của bạn. /usr/bin/passwd có mode 4755 (-rwsr-xr-x) trên hầu hết hệ thống Linux, nhờ đó người dùng thường cập nhật được tệp mật khẩu thuộc sở hữu của root. Linux bỏ qua setuid trên shell script và trên thư mục.
Trên chương trình, nó chạy với nhóm của tệp. Trên thư mục thì hữu ích hơn: tệp mới tạo bên trong nhận nhóm của thư mục, và thư mục con mới kế thừa setgid. 2775 là mode kinh điển cho thư mục dùng chung của một nhóm.
Trên thư mục, chỉ chủ sở hữu tệp, chủ sở hữu thư mục hoặc root mới xóa hay đổi tên được tệp bên trong, kể cả khi ai cũng ghi được vào đó. Đó là lý do /tmp có mode 1777 (drwxrwxrwt). Linux bỏ qua sticky bit trên tệp.
Chữ S hoặc T viết hoa trong ls -l nghĩa là bit đặc biệt đã được bật nhưng bit thực thi ở cùng vị trí thì không. Ví dụ, 4644 hiển thị là rwSr--r-- và 1666 là rw-rw-rwT.
Advertisement
Mode Symbolic: u, g, o, a Với +, - và =
Mode symbolic thay đổi quyền dựa trên những gì đang có, điều mà một số octal đơn thuần không làm được. Nó gồm ba phần: ai (u chủ sở hữu, g nhóm, o người khác, a tất cả), một toán tử (+ thêm, - bớt, = đặt chính xác) và các quyền (r, w, x, cùng s và t). Phân tách nhiều thay đổi bằng dấu phẩy, không có khoảng trắng.
chmod +x file không có chữ cái chỉ đối tượng nghĩa là áp dụng cho cả ba lớp, trừ những gì umask của bạn chặn. Với umask thông thường 022, lệnh này tương đương a+x.
chmod u+x deploy.sh: cho phép chủ sở hữu chạy script và không thay đổi gì khác.chmod go-w report.txt: bỏ quyền ghi của nhóm và người khác.chmod o= secrets.txt: tước mọi quyền của người khác.chmod a+r index.html: mọi người đều đọc được tệp.chmod u=rwx,g=rx,o=rx app: cách viết symbolic của 755. Công cụ hiển thị dạng này cho mọi mode.chmod -R u=rwX,go=rX public_html: chữ X viết hoa chỉ thêm quyền thực thi cho thư mục và cho tệp vốn đã có quyền thực thi, nên thư mục thành 755 và tệp thông thường thành 644.
umask: Quyền Mặc Định Cho Tệp Mới
umask quyết định quyền mà tệp và thư mục mới nhận được. Hầu hết chương trình tạo tệp với 666 (rw-rw-rw-) và thư mục với 777, rồi mọi bit được bật trong umask sẽ bị tắt đi. Với umask phổ biến 022, tệp mới có quyền 644 và thư mục mới có quyền 755.
Đây là phép mask theo bit, không phải phép trừ. Với umask 027, tệp nhận 640; trừ 027 khỏi 666 theo từng chữ số thậm chí không cho ra một mode hợp lệ. Mở tab Umask trong công cụ để xem kết quả cho bất kỳ giá trị nào.
022: tệp 644, thư mục 755. Mặc định thông thường.002: tệp 664, thư mục 775. Cho phép nhóm của bạn sửa những gì bạn tạo; phổ biến ở nơi mỗi người dùng có một nhóm riêng.027: tệp 640, thư mục 750. Người khác không có quyền gì, lựa chọn tốt cho máy chủ.077: tệp 600, thư mục 700. Hoàn toàn riêng tư.Chạy
umaskđể xem giá trị của bạn,umask -Sđể xem dưới dạng chữ cái vàumask 027để đổi cho shell hiện tại. Thêm lệnh vào~/.bashrchoặc~/.profileđể giữ lại lâu dài.
Advertisement
Cách Dùng Chmod Calculator
Đánh dấu Đọc, Ghi và Thực thi cho chủ sở hữu, nhóm và người khác, hoặc nhấp một preset như 644 hay 755. Mỗi hàng hiển thị chữ số của nó ngay khi bạn thao tác.
Nhập số octal như 750 hoặc 2775, hoặc dán chuỗi symbolic như rwxr-x---. Chuỗi ls -l đầy đủ như drwxr-sr-x cũng dùng được, và loại tệp sẽ được hiển thị.
Đánh dấu Setuid, Setgid hoặc Sticky để có mode 4 chữ số. Cảnh báo sẽ xuất hiện khi một mode cho phép bất kỳ ai ghi mà không có sticky bit.
Nhập tên tệp hoặc thư mục, đánh dấu Đệ quy cho cả cây thư mục và sao chép lệnh chmod dạng số hoặc symbolic. Địa chỉ trang lưu lại mode (ví dụ ?mode=750), nên bạn có thể đánh dấu trang hoặc chia sẻ.
Ví Dụ Lệnh chmod
Chạy các lệnh này trong terminal Linux hoặc macOS. Thêm sudo phía trước khi tệp thuộc về người dùng khác hoặc root.
chmod +x deploy.sh # thêm quyền thực thi
chmod 755 deploy.sh # hoặc đặt mode đầy đủ
./deploy.shfind /var/www/html -type d -exec chmod 755 {} +
find /var/www/html -type f -exec chmod 644 {} +chmod -R 755 folder # tệp cũng bị thêm quyền thực thi
chmod -R u=rwX,go=rX folder # thư mục 755, tệp 644chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519 ~/.ssh/authorized_keys
chmod 644 ~/.ssh/id_ed25519.pubstat -c '%a %n' file # Linux: 644 file
stat -f '%Lp %N' file # macOS: 644 file
stat -f '%Mp%Lp %N' file # macOS kèm bit đặc biệt: 0644 filechgrp developers /srv/project
chmod 2775 /srv/project # tệp mới nhận nhóm developersThêm Công Cụ Cho Lập Trình Viên
Các công cụ miễn phí khác dành cho lập trình viên và quản trị hệ thống, tất cả đều chạy trong trình duyệt. Cần ID duy nhất cho tệp hoặc bản ghi? Hãy thử công cụ tạo UUID.