Vấn đề: 'bash: ./script.sh: Permission denied'
Bạn đã dành công sức viết một script Bash hữu ích, lưu lại và giờ đây bạn rất muốn chạy nó. Nhưng thay vì script của bạn thực thi, terminal lại trả về một thông báo khó chịu:
bash: ./script.sh: Permission denied
Lỗi này cực kỳ phổ biến, đặc biệt đối với những người mới dùng Linux hoặc khi di chuyển script giữa các hệ thống khác nhau. Về cơ bản, nó có nghĩa là hệ điều hành của bạn đang chặn script không cho chạy vì nó thiếu các quyền cần thiết.
TL;DR: Cách khắc phục nhanh
Thông thường, lỗi này xuất hiện vì script của bạn không có quyền thực thi quan trọng. Dưới đây là cách nhanh nhất để mọi thứ hoạt động:
- Cấp quyền thực thi:
chmod +x script.sh
- Chạy script của bạn:
./script.sh
Nếu cách đó hiệu quả, thật tuyệt vời! Bạn đã sẵn sàng. Nếu không, đừng lo lắng; hãy tiếp tục đọc để có giải thích chi tiết hơn và các giải pháp tiềm năng khác.
Hiểu về 'Permission denied'
Trong Linux và các hệ điều hành tương tự Unix, quyền hạn tệp là một phần cốt lõi trong mô hình bảo mật của chúng. Mỗi tệp và thư mục có các quyền cụ thể quy định ai có thể đọc, ghi hoặc thực thi nó. Khi bạn thấy 'Permission denied' cho một script, điều đó đặc biệt cho bạn biết rằng người dùng đang cố gắng chạy nó không có quyền thực thi quan trọng đối với tệp đó.
Khi bạn cố gắng chạy một script bằng cách sử dụng ./script.sh, bạn đang trực tiếp chỉ dẫn shell của mình thực thi nó. Hệ điều hành sau đó kiểm tra xem tệp có bit 'execute' được bật cho người dùng hoặc nhóm của bạn hay không. Nếu bit đó bị thiếu, lỗi 'Permission denied' sẽ xuất hiện.
Tình huống này thường xuyên phát sinh vì một vài lý do:
- Bạn tự tạo script. Theo mặc định, nhiều hệ thống không tự động gán quyền thực thi cho các tệp mới được tạo.
- Bạn đã tải xuống hoặc sao chép script từ một nguồn bên ngoài, như hệ thống Windows hoặc một trang web. Trong những trường hợp này, quyền hạn tệp có thể không được chuyển đúng cách.
Các giải pháp từng bước
Phương pháp 1: Thêm quyền thực thi bằng chmod
Đây thường là cách khắc phục đơn giản và trực tiếp nhất. Lệnh chmod (viết tắt của 'change mode') là công cụ đắc lực để bạn sửa đổi quyền hạn tệp.
1. Kiểm tra quyền hạn hiện tại
Trước khi thực hiện bất kỳ thay đổi nào, bạn nên kiểm tra quyền hạn hiện tại của script bằng cách sử dụng ls -l:
ls -l script.sh
Bạn sẽ thấy đầu ra tương tự ví dụ này:
-rw-r--r-- 1 user user 1234 Mar 16 10:00 script.sh
Phần quan trọng cần xem xét là -rw-r--r--. Hãy cùng phân tích ý nghĩa của các ký tự này:
- Ký tự đầu tiên (
-) chỉ ra rằng đây là một tệp thông thường (dsẽ có nghĩa là thư mục). rw-: Chủ sở hữu tệp (user) có thể đọc và ghi, nhưng thiếu quyền thực thi.r--: Các thành viên của nhóm sở hữu (cũng làusertrong ví dụ này) có thể đọc, nhưng không thể ghi hoặc thực thi.r--: Tất cả người dùng khác có thể đọc, nhưng cũng không thể ghi hoặc thực thi.
Hãy chú ý đến việc thiếu 'x' (execute) cho chủ sở hữu. Đó gần như chắc chắn là lý do bạn gặp phải lỗi này.
2. Cấp quyền thực thi
Để thêm quyền thực thi cụ thể cho chủ sở hữu tệp (thường là bạn), hãy sử dụng lệnh này:
chmod +x script.sh
Tùy chọn +x thêm quyền thực thi. Nếu bạn cần cấp quyền thực thi cho tất cả mọi người (chủ sở hữu, nhóm và những người khác), bạn có thể sử dụng chmod a+x script.sh hoặc chế độ bát phân chmod 755 script.sh. Ví dụ, 755 cấp quyền đọc/ghi/thực thi cho chủ sở hữu, và đọc/thực thi cho nhóm và những người khác.
3. Xác minh quyền hạn
Chạy lại ls -l để xác nhận thay đổi của bạn:
ls -l script.sh
Bạn sẽ thấy một cái gì đó như thế này:
-rwxr--r-- 1 user user 1234 Mar 16 10:00 script.sh
Ký tự 'x' sau 'rw' hiện xác nhận rằng chủ sở hữu có quyền thực thi.
4. Chạy Script
Với các quyền thực thi đã được đặt đúng cách, giờ đây bạn có thể chạy script của mình mà không gặp vấn đề gì:
./script.sh
Phương pháp 2: Chạy rõ ràng bằng trình thông dịch
Ngay cả khi một script thiếu quyền thực thi, bạn vẫn thường có thể chạy nó bằng cách trực tiếp cho shell của bạn biết trình thông dịch nào sẽ sử dụng. Phương pháp này hoạt động vì bạn đang thực thi chính trình thông dịch (ví dụ: bash), sau đó truyền script của bạn làm đối số cho nó. Trình thông dịch đã có quyền thực thi, cho phép nó đọc và xử lý nội dung script của bạn.
1. Sử dụng bash
bash script.sh
Lệnh này hướng dẫn hệ thống của bạn sử dụng trình thông dịch bash để chạy script.sh. Trong trường hợp này, tệp script không cần quyền thực thi, vì bash đang xử lý việc thực thi.
2. Sử dụng sh (cho các script tuân thủ POSIX)
sh script.sh
Tương tự như sử dụng bash, cách tiếp cận này sử dụng shell mặc định (thường được liên kết với bash hoặc dash) để thực thi script.
Mặc dù phương pháp này giúp script của bạn chạy hiệu quả, nhưng tốt nhất bạn nên cấp quyền thực thi nếu bạn có ý định chạy script trực tiếp bằng ./script.sh.
Phương pháp 3: Sửa quyền sở hữu tệp bằng chown
Tình huống này ít phổ biến hơn đối với lỗi 'permission denied' cơ bản. Tuy nhiên, nó rất phù hợp nếu chủ sở hữu hiện tại của script không phải là người dùng đang cố gắng chạy nó, và người dùng đó không có đủ quyền nhóm hoặc 'khác'. Lệnh chown (thay đổi chủ sở hữu) cho phép bạn sửa đổi chủ sở hữu và/hoặc nhóm của một tệp.
1. Kiểm tra chủ sở hữu và nhóm
Sử dụng lại ls -l script.sh. Hãy chú ý kỹ đến cột thứ ba và thứ tư, hiển thị chủ sở hữu và nhóm tương ứng:
-rwxr--r-- 1 **otheruser** **othergroup** 1234 Mar 16 10:00 script.sh
Nếu bạn đăng nhập với tư cách youruser nhưng script thuộc sở hữu của otheruser, bạn có thể sẽ cần thay đổi quyền sở hữu của nó. Hành động này thường yêu cầu quyền sudo.
sudo chown youruser:yourgroup script.sh
Hãy nhớ thay thế youruser và yourgroup bằng tên người dùng và nhóm chính thực tế của bạn. Sau khi thay đổi quyền sở hữu, hãy đảm bảo rằng các quyền thực thi được đặt đúng cách, như đã giải thích trong Phương pháp 1.
Phương pháp 4: Kiểm tra quyền hạn của thư mục cha
Đôi khi, vấn đề không nằm ở bản thân script, mà ở thư mục chứa nó. Nếu bạn thiếu các quyền cần thiết để liệt kê hoặc truy cập thư mục đó, bạn sẽ không thể chạy bất kỳ script nào có trong đó.
1. Kiểm tra quyền hạn của thư mục
Kiểm tra quyền hạn của thư mục chứa script của bạn:
ls -ld .
Ký tự 'd' ở đầu chuỗi quyền xác nhận đó là một thư mục. Đối với các thư mục, quyền 'execute' là rất cần thiết; nó cho phép bạn cd vào thư mục và truy cập nội dung của nó.
2. Cấp quyền thư mục (nếu cần)
Nếu quyền hạn thư mục quá chặt chẽ (ví dụ: ---r--r-- cho 'others' hoặc nhóm cụ thể của bạn), bạn có thể cần thêm quyền đọc và thực thi:
chmod o+rx .
Hoặc, nếu bạn cần cấp quyền cho một nhóm cụ thể:
chmod g+rx .
Luôn thận trọng khi thay đổi quyền hạn thư mục, đặc biệt trong môi trường chia sẻ, vì nó có thể ảnh hưởng đến những người dùng khác.
Xác minh: Xác nhận sửa lỗi
Sau khi áp dụng bất kỳ giải pháp nào trong số này, đặc biệt là Phương pháp 1, hãy luôn dành một chút thời gian để xác minh các thay đổi của bạn:
- Kiểm tra lại quyền hạn tệp:
ls -l script.sh
Xác nhận rằng bit 'x' (thực thi) hiện đã có cho người dùng hoặc nhóm chính xác.
- Chạy lại script:
./script.sh
Nếu script của bạn thực thi thành công và thực hiện tác vụ dự định mà không có lỗi 'Permission denied', thì việc sửa lỗi của bạn đã được xác nhận!
Đọc thêm và tài nguyên
man chmod: Tìm hiểu sâu hơn về chi tiết thay đổi quyền hạn tệp.man chown: Tìm hiểu thêm về việc sửa đổi quyền sở hữu tệp.- Hướng dẫn toàn diện về quyền hạn tệp Linux: Hiểu hệ thống 'rwx' và các chế độ bát phân như 755 và 644.

