Permission denied trên Linux: 10 trường hợp, gồm cả /dev/null
Permission denied là lỗi trên Linux xuất hiện khi tài khoản bạn đang dùng không có quyền dùng tệp, thư mục hoặc lệnh đó. Hãy chọn trường hợp của bạn theo tên lệnh và đường dẫn ở đầu dòng lỗi, kiểm tra quyền và chủ sở hữu bằng ls -l, rồi chạy lại với quyền hoặc tài khoản phù hợp với trường hợp đó là xử lý được.
Kết quả bên dưới được chạy bằng tài khoản root trên máy chủ AlmaLinux 9.8 và tài khoản thường trên máy chủ Debian 12; tên tài khoản, tên máy chủ và thời gian trong kết quả của /dev/null là giá trị ví dụ.
1️⃣ Tìm nguyên nhân Permission denied
Dòng lỗi kết thúc theo dạng [lệnh: đối tượng: Permission denied], và nhờ tên lệnh cùng đường dẫn đứng trước, bạn biết bị chặn ở đâu. Trong sơ đồ bên dưới, hãy chọn thông báo lỗi giống trên màn hình của bạn để thấy lệnh cần kiểm tra trước và phần cần đọc trong bài này.
2️⃣ Các lỗi Permission denied thường gặp
🔲 Quyền đọc và ghi tệp
Để đọc tệp, tài khoản đó cần quyền đọc (r), còn để sửa hoặc tạo mới thì cần quyền ghi (w). secret.txt có quyền 600 chỉ chủ sở hữu root mới đọc và ghi được.
ls -l secret.txt-rw------- 1 root root 16 Oct 29 00:29 secret.txtrunuser -u daemon -- cat secret.txtcat: secret.txt: Permission deniedKhi đọc cùng tệp đó bằng tài khoản khác là daemon, yêu cầu bị từ chối ngay. Tạo tệp trong thư mục không có quyền ghi cũng gặp lỗi tương tự; trên máy chủ Debian 12, touch bằng tài khoản thường bị chặn trong thư mục lock có quyền 000.
touch ~/touchtest/lock/x.txttouch: cannot touch '/home/user/touchtest/lock/x.txt': Permission deniedỞ cột đầu tiên của ls -l, hãy xem lần lượt chủ sở hữu, nhóm và các tài khoản khác có r và w hay không, rồi chỉ thêm quyền cho tài khoản cần dùng bằng chmod hoặc đổi chủ sở hữu bằng chown.
🔲 Quyền đi qua thư mục
Dù quyền của tệp đã đúng, nếu thư mục ở giữa đường dẫn không có quyền x thì bạn không tới được tệp bên trong. Với thư mục, x là quyền đi qua thư mục đó để vào trong, còn r là quyền đọc danh sách tên bên trong.
ls -ld web web/cssdrw-r--r-- 3 root root 35 Oct 29 00:29 web
drw-r--r-- 2 root root 23 Oct 29 00:29 web/cssrunuser -u daemon -- ls -l webls: cannot access 'web/css': Permission denied
ls: cannot access 'web/index.html': Permission denied
total 0
d????????? ? ? ? ? ? css
-????????? ? ? ? ? ? index.htmlThư mục web chỉ có r nên daemon đọc được tên bên trong là css và index.html, nhưng vì không có x nên quyền và kích thước vẫn là dấu hỏi. Ngược lại, thư mục site chỉ có x mà không có r thì bị chặn liệt kê, còn tệp đã biết tên thì vẫn đọc được.
ls -ld sitedrwx--x--x 2 root root 24 Oct 29 00:29 siterunuser -u daemon -- ls sitels: cannot open directory 'site': Permission deniedrunuser -u daemon -- cat site/index.html<h1>index</h1>Nếu đường dẫn dài, hãy dùng ls -ld kiểm tra từng thư mục từ trên xuống xem có x hay không, rồi chỉ thêm cho thư mục bị chặn quyền x mà tài khoản đó cần để đi qua.
🔲 Quyền thực thi
Để chạy script dạng ./tên tệp, tệp đó phải có quyền x. deploy.sh có quyền 644 đã bị từ chối khi chạy.
ls -l deploy.sh-rw-r--r-- 1 root root 8 Oct 29 00:29 deploy.sh./deploy.shbash: line 1: ./deploy.sh: Permission deniedSau khi thêm x cho chủ sở hữu bằng chmod u+x, cột đầu tiên đổi thành [-rwxr--r--].
chmod u+x deploy.shls -l deploy.sh-rwxr--r-- 1 root root 8 Oct 29 00:29 deploy.shNếu đã có quyền x mà vẫn bị từ chối khi chạy, hãy kiểm tra hệ thống tệp chứa tệp đó có được gắn với noexec hay không.
🔲 Đọc thông tin dành riêng cho root
Tài khoản thường không đọc được thông tin mà hệ thống dành riêng cho root, như tiến trình do root khởi chạy hay thông tin mật khẩu của tài khoản khác. Trên máy chủ Debian 12, mở thư mục fd của tiến trình số 1 bằng tài khoản thường đã gặp lỗi quyền.
ls /proc/1/fdls: cannot open directory '/proc/1/fd': Permission deniedchage -l daemonchage: Permission denied.Thông tin hết hạn mật khẩu của tài khoản khác cũng bị chặn vì cùng lý do; /etc/shadow chứa thông tin này là tệp được đặt để người dùng thường không đọc được. Với những lỗi như vậy, đừng mở rộng quyền mà hãy chạy lại lệnh bằng sudo hoặc tài khoản root.
🔲 Khi > bị chặn dù đã thêm sudo
sudo chỉ chạy bằng root lệnh viết phía sau nó, còn việc mở tệp cho chuyển hướng (>) do shell của tài khoản đang dùng xử lý trước khi lệnh chạy. Vì vậy, nếu chuyển hướng kết quả của sudo echo vào tệp chỉ root mới ghi được, dòng lỗi sẽ bắt đầu bằng tên shell theo dạng [bash: đường dẫn tệp: Permission denied].
sudo echo x > /root/test.txtMuốn chuyển hướng cũng chạy bằng root, hãy bọc cả dòng trong sh -c để chạy luôn shell bằng sudo; tài liệu chính thức của sudo cũng đưa ví dụ chạy bên trong sh -c để chuyển hướng hoạt động.
sudo sh -c 'echo x > /root/test.txt'tee nhận đầu vào chuẩn rồi ghi thẳng vào các tệp được chỉ định, nên khi chạy tee bằng sudo, tệp sẽ do tee có quyền root mở. tee còn in nội dung nhận được ra màn hình thêm một lần.
echo x | sudo tee /root/test.txt🔲 Đăng nhập SSH bị từ chối
Nếu trước Permission denied có [tài khoản@địa chỉ máy chủ:] và trong ngoặc có phương thức xác thực như publickey, đó là trường hợp bị từ chối ở bước xác thực đăng nhập, và chỗ cần kiểm tra khác với quyền tệp. sshd trên máy chủ để StrictModes ở giá trị mặc định yes, nên trước khi nhận đăng nhập sẽ kiểm tra quyền và chủ sở hữu của thư mục home và các tệp của tài khoản đó. Nếu thư mục home, thư mục ~/.ssh hoặc ~/.ssh/authorized_keys có bất kỳ chỗ nào tài khoản khác ghi được, sshd sẽ không dùng tệp khóa đó, vì vậy hãy dùng ls -ld kiểm tra cả ba chỗ không có quyền w của tài khoản khác.
⌨️ Trình mô phỏng Permission denied
Trình mô phỏng bên dưới bắt đầu bằng tài khoản root, và với runuser, bạn có thể chuyển thành tài khoản khác là daemon để tự xem kết quả khi đọc tệp, đi qua thư mục và quyền thực thi bị chặn.
3️⃣ Các lỗi Permission denied hiếm gặp
Nếu cột quyền đã đúng mà vẫn bị từ chối, đó là trường hợp bị chặn từ bên ngoài các bit quyền, như chính sách SELinux hay gắn kết noexec. Nếu chạy bằng root mà vẫn bị từ chối thực thi, hãy kiểm tra tệp đó có hoàn toàn không có bit x hay không.
Trên máy chủ bật SELinux, dù bit quyền đã đúng, nếu chính sách SELinux chặn thì vẫn xuất hiện Permission denied, nên khi đó hãy kiểm tra trước bản ghi từ chối của SELinux. Trên máy chủ có daemon audit đang chạy, bản ghi từ chối nằm trong /var/log/audit/audit.log dưới dạng [avc: denied], kèm hành động bị chặn, tên lệnh (comm) và tên đối tượng (name).
Xem SELinux có đang bật hay không bằng getenforce, rồi chạy ausearch bằng root để kiểm tra các bản ghi bị chặn hôm nay.
getenforceausearch -m AVC,USER_AVC,SELINUX_ERR,USER_SELINUX_ERR -ts todayVới rsync daemon, lỗi [Permission denied (13)] khi nhận tệp cũng là trường hợp SELinux chặn truy cập vào đường dẫn của module.
Trên hệ thống tệp gắn với noexec, không thể chạy tệp trực tiếp, nên dù ls -l hiện x, tệp vẫn bị từ chối với [bash: đường dẫn script: Permission denied]. Đưa thư mục đó cho findmnt -T sẽ thấy nơi thư mục được gắn và các tùy chọn; nếu tùy chọn có noexec thì là trường hợp này.
findmnt -T /tmp -o TARGET,OPTIONSroot vượt qua hầu hết các kiểm tra quyền, nhưng riêng thực thi chỉ được phép khi ít nhất một trong chủ sở hữu, nhóm hoặc các tài khoản khác có x. Vì vậy, script không có x nào sẽ bị từ chối dù root chạy bằng ./.
Khi chạy deploy.sh có cột đầu tiên là [-rw-r--r-- 1 root root] bằng ./ từ tài khoản root, kết quả là [bash: line 1: ./deploy.sh: Permission denied].
🔲 Khi /dev/null đã thành tệp thường
Nếu ngay sau khi vào SSH bằng tài khoản thường mà các dòng bên dưới hiện liên tiếp trước dấu nhắc shell, hãy kiểm tra trước xem /dev/null, thiết bị ký tự mà mọi tài khoản dùng để bỏ kết quả, có bị đổi thành tệp thường thuộc root hay không. Số dòng khác nhau tùy máy chủ theo số script profile được đọc khi đăng nhập, và trên cùng máy chủ, lỗi này không xuất hiện sau khi chuyển sang root.
-bash: /dev/null: Permission denied
-bash: /dev/null: Permission denied
-bash: /dev/null: Permission denied
...ls -l /dev/null-rw-r--r-- 1 root root 55 Jan 10 09:00 /dev/nullstat -c %F /dev/nullregular fileCột đầu tiên là [-rw-r--r--] và ở vị trí kích thước hiện 55, tức là chữ lỗi mà các lệnh khác bỏ đi đã dồn lại trong tệp. Nếu dòng lệnh dọn dẹp có lẫn dạng bên dưới và được chạy bằng root, rm sẽ xóa tệp thiết bị, rồi chuyển hướng 2>/dev/null của lệnh kế tiếp tạo mới một tệp thường thuộc root với cùng tên.
rm -f /dev/null 2>/dev/nullHãy chạy dòng bên dưới bằng root. Tạo thiết bị mới bằng một tên bên cạnh rồi ghi đè bằng mv thì không có lúc nào tên bị trống, nên không còn kẽ hở để chuyển hướng khác lại tạo tệp thường giữa lúc xóa và lúc tạo.
mknod -m 666 /dev/null.new c 1 3 && mv -f /dev/null.new /dev/null && ls -l /dev/nullcrw-rw-rw- 1 root root 1, 3 Jan 10 09:05 /dev/nullstat -c %F /dev/nullcharacter special file[c 1 3] của mknod là số của /dev/null trong danh sách số thiết bị của kernel. Sau khi khôi phục, echo x > /dev/null bằng tài khoản thường cũng kết thúc không lỗi. Khởi động lại cũng có thể đưa nó trở lại, nhưng một dòng ở trên, vốn không cần dừng máy chủ, nhanh hơn.
| Xác nhận | Trước khi sửa | Sau khi sửa |
|---|---|---|
| Cột đầu tiên của ls -l | -rw-r--r-- | crw-rw-rw- |
| Vị trí kích thước của ls -l | 55 | 1, 3 |
| stat -c %F | regular file | character special file |
| Ghi bằng tài khoản thường | Permission denied | Không lỗi |
Kết quả cần bỏ thì chỉ chuyển tới >/dev/null hoặc 2>/dev/null, và trừ khi đang khôi phục, đừng bao giờ ghi /dev/null làm đối tượng của rm hay mv.
🔢 FAQ & nội dung đề xuất
Máy chủ web · 403
Lỗi 403 của Apache sau khi cài APM (403 Forbidden)
Bài viết về trường hợp máy chủ web không đọc được thư mục web, để lại Permission denied trong error_log và hiện 403.
Máy chủ web · 503
Lỗi 503 sau khi cài APM
Bài viết kiểm tra bằng error.log trường hợp Apache không kết nối được với socket của php-fpm nên trả về 503.
ℹ️ Thông báo tiếp thị liên kết
Nội dung trên trang này có chứa liên kết affiliate (tiếp thị liên kết). Khi khách truy cập mua sản phẩm hoặc dịch vụ qua các liên kết này, trang sẽ nhận hoa hồng từ bên bán. Trong quá trình đó, số tiền người mua phải trả (sẽ giảm khi có chương trình khuyến mãi ↓) không hề tăng lên. Giá, khuyến mãi và tình trạng hàng được đăng theo thời điểm viết bài và có thể khác với thực tế, vì vậy hãy kiểm tra lại lần cuối với bên bán trước khi mua. Việc chọn và đánh giá sản phẩm dựa trên tiêu chí riêng của trang; việc có nhận hoa hồng hay không không ảnh hưởng đến thứ tự giới thiệu hay nội dung đánh giá.