Câu trả lời:
Giả sử bạn có tệp myscript
chứa các mục sau:
#!/bin/bash
echo "Hello, World!"
Nếu bạn làm cho tệp này có thể thực thi được và chạy nó với ./myscript
, thì kernel sẽ thấy rằng hai byte đầu tiên là #!
, có nghĩa đó là tệp script. Sau đó, hạt nhân sẽ sử dụng phần còn lại của dòng làm trình thông dịch và truyền tệp làm đối số đầu tiên. Vì vậy, nó chạy:
/bin/bash myscript
và bash đọc tệp và thực thi các lệnh mà nó chứa.
Do đó, để bash (hoặc bất kỳ trình thông dịch nào mà tập lệnh của bạn yêu cầu) "thực thi" tập lệnh, nó chỉ cần có khả năng đọc tệp.
Vì vậy, đối với các tập lệnh, bit thực thi chỉ làm cho nó thuận tiện hơn một chút để thực thi nó. Miễn là bash có thể thực thi được, bạn luôn có thể chạy bash với tệp script làm đối số hoặc chạy bash tương tác và sao chép dán dòng script theo dòng vào thiết bị đầu cuối của bạn để thực thi các lệnh.
Hãy chắc chắn rằng bạn không nhầm lẫn "thực thi tập lệnh shell" với "chạy tập lệnh shell bằng sh".
Điều này sẽ không bị ảnh hưởng bởi quyền truy cập tệp trên file.sh
:
sh file.sh
Bạn đang thực thi sh
(phân giải chương trình /bin/sh
), nó đọc file.sh
và thực thi mã của nó.
Quyền truy cập tệp sẽ có hiệu lực nếu bạn thực sự thực thi chính tập lệnh :
./file.sh
Lưu ý rằng các quyền của tệp không được hỗ trợ bởi các hệ thống tệp không phải của Linux, như FAT. Vì vậy, ngay cả khi bạn chạy chmod -x file.sh
, tệp vẫn sẽ có quyền cũ.
Thực thi quyền được thực thi bởi hệ thống tập tin. Nhưng các chương trình cũng có thể "thực thi" mã bằng cách đọc nội dung tệp, bỏ qua các quyền của hệ thống tệp khi "thực thi".
bash
) để thực hiện - để chặn rằng bạn cũng sẽ phải lấy đi sự read
cho phép của họ .
If you set the executable permission, the script can be run directly by users who have that permission - whether they have it on a group, world or owner basis
Nhưng làm thế nào quyền được cấp cho người dùng khác nhau bằng cách kiểm tra quyền thực thi? Và tôi đã nhận được điểm thứ hai của bạn. Bạn có nghĩa là lấy đi sự cho phép đọc kịch bản của họ để họ thậm chí không thể xử lý nó thông qua bash. Đúng?
sudo chmod g+x myfile.sh
trong thiết bị đầu cuối để thêm quyền thực thi cho nhóm của tệp. Xem hướng dẫn cấp quyền tệp . Để quản lý quyền cho nhiều người dùng đồng thời, bạn sẽ sử dụng các nhóm, xem ví dụ: Quản lý các nhóm .
Đừng nghĩ về nó theo cách đó. Tôi có thể thực hiện tập tin này không? Hãy nghĩ về nó theo cách: Ai có thể thực hiện tệp này?
Nếu máy tính là của bạn và tập tin là của bạn, tôi chắc chắn bạn có thể thực thi nó. Bạn có thể muốn xem xét thêm về các lệnh như chmod và chown , và quyền truy cập tệp.
Tôi hy vọng điều đó sẽ giúp.
Tòa nhà exec
của nhân Linux không thành công EACCES
nếu tệp không thể thực thi được
Mặc dù bạn có thể làm sh myprog.sh
(chỉ đọc các tệp và thông dịch là), nhưng cố gắng chạy chương trình là ./myprog.sh
không thể, vì khi bạn làm điều đó:
exec
gọi hệ thống./myprog.sh
exec
gọi hệ thống của nhân Linux như được giải thích tại: /programming/2429511/why-do-people-write-the-usr-bin-env-python-shebang-on -the-First-line-of-a-pyt / 40938801 # 40938801Điều này có thể được xác minh với main.c
:
#define _XOPEN_SOURCE 700
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
int main(void) {
char *argv[] = {"myprog", NULL};
char *envp[] = {NULL};
int ret;
ret = execve("myprog.sh", argv, envp);
perror("execve");
printf("%d\n", errno);
printf("%d\n", EACCES);
}
và myprog.sh
:
#!/bin/sh
echo worked
Nếu myprog.sh
không thể thực thi được, main
thất bại với:
execve: Permission denied
13
13
Đã thử nghiệm trong Ubuntu 17.10 , gcc -std=c99
.
POSIX 7 đề cập rằng tại:
Các hàm exec, ngoại trừ fexecve (), sẽ thất bại nếu:
[EACCES] Quyền tìm kiếm bị từ chối đối với một thư mục được liệt kê trong tiền tố đường dẫn của tệp hình ảnh quy trình mới hoặc tệp hình ảnh quy trình mới từ chối quyền thực thi.
Cơ sở hợp lý khác có thể được tìm thấy tại: /security/66550/unix-execute- allow-can-be- easy-bypassed-is-it-superfupt-or-why-the