Khi tôi cố chạy ./script.sh
tôi đã nhận Permission denied
nhưng khi tôi chạy thì bash script.sh
mọi thứ đều ổn.
Tôi đã làm gì sai?
Khi tôi cố chạy ./script.sh
tôi đã nhận Permission denied
nhưng khi tôi chạy thì bash script.sh
mọi thứ đều ổn.
Tôi đã làm gì sai?
Câu trả lời:
Điều đó có nghĩa là bạn không có bit quyền thực thi được đặt cho script.sh
. Khi chạy bash script.sh
, bạn chỉ cần đọc quyền cho script.sh
. Hãy xem sự khác biệt giữa việc chạy tập lệnh bash script.sh và và. để biết thêm.
Bạn có thể xác minh điều này bằng cách chạy ls -l script.sh
.
Bạn thậm chí có thể không cần phải bắt đầu một quy trình Bash mới. Trong nhiều trường hợp, bạn chỉ cần chạy source script.sh
hoặc . script.sh
chạy các lệnh script trong trình vỏ tương tác hiện tại của bạn. Bạn có thể muốn bắt đầu một quy trình Bash mới nếu tập lệnh thay đổi thư mục hiện tại hoặc sửa đổi môi trường của quy trình hiện tại.
Nếu các bit quyền POSIX được đặt chính xác, Danh sách điều khiển truy cập (ACL) có thể đã được cấu hình để ngăn bạn hoặc nhóm của bạn thực thi tệp. Ví dụ: các quyền POSIX sẽ chỉ ra rằng tập lệnh shell thử nghiệm có thể thực thi được.
$ ls -l t.sh
-rwxrwxrwx+ 1 root root 22 May 14 15:30 t.sh
Tuy nhiên, cố gắng thực hiện các kết quả tập tin trong:
$ ./t.sh
bash: ./t.sh: Permission denied
Các getfacl
lệnh trình bày lý do tại sao:
$ getfacl t.sh
# file: t.sh
# owner: root
# group: root
user::rwx
group::r--
group:domain\040users:rw-
mask::rwx
other::rwx
Trong trường hợp này, nhóm chính của tôi domain users
đã bị thu hồi quyền thực thi bằng cách hạn chế ACL với sudo setfacl -m 'g:domain\040users:rw-' t.sh
. Hạn chế này có thể được gỡ bỏ bằng một trong các lệnh sau:
sudo setfacl -m 'g:domain\040users:rwx' t.sh
sudo setfacl -b t.sh
Xem:
Cuối cùng, lý do trong trường hợp cụ thể này vì không thể chạy tập lệnh là hệ thống tập tin mà tập lệnh nằm trên được gắn với noexec
tùy chọn. Tùy chọn này ghi đè quyền POSIX để ngăn bất kỳ tệp nào trên hệ thống tệp đó được thực thi.
Điều này có thể được kiểm tra bằng cách chạy mount
để liệt kê tất cả các hệ thống tập tin được gắn kết; các tùy chọn gắn kết được liệt kê trong ngoặc đơn trong mục tương ứng với hệ thống tệp, ví dụ:
/dev/sda3 on /tmp type ext3 (rw,noexec)
Bạn có thể di chuyển tập lệnh sang hệ thống tệp được gắn kết khác hoặc kết nối lại hệ thống tệp cho phép thực thi:
sudo mount -o remount,exec /dev/sda3 /tmp
Lưu ý: Tôi đã sử dụng /tmp
làm ví dụ ở đây vì có những lý do bảo mật tốt để tiếp tục /tmp
gắn kết với noexec,nodev,nosuid
tập hợp các tùy chọn.
Thử
chmod 755 script.sh
điều này sẽ làm cho tập tin thực thi. Vậy hãy thử đi,
./script.sh
Hy vọng điều này sẽ làm việc.
Trên win7 của tôi với quản trị viên chạy cmd; Tôi có các tệp .sh được liên kết với cygwin64 / bin / bash, nhưng nó đã bị chặn bởi cmd. Không có gợi ý nào ở trên giúp được (chmod, setfacl, mount).
Giải pháp bên dưới hoạt động, đó là một trình sửa lỗi acl-búa acl của quản trị viên bất cứ khi nào các thư mục / tệp không thể truy cập được đối với quản trị viên trên win7, thường là):
Start > run cmd as Admin
c:\> script.sh
Access is denied.
cmd> chmod 0777 script.sh c:\cygwin64\bin\bash.exe
cmd> script.sh
Access is denied.
> assoc .sh
.sh=bash
> ftype bash
bash=C:\cygwin64\bin\bash.exe -- "%1" %*
> bash
$ FILE=c:/cygwin64/bin/bash.exe
$ FILE=${FILE////\\} # s,/,\,g
# Compare these permissions using accesschk by Mark Russinovich 2015
$ accesschk.exe -lq $FILE
$ accesschk.exe -lq c:/windows/system32/cmd.exe
# [large output not shown]
# === Solution: Change windows acl for bash ===
$ takeown /F $FILE /A > /dev/null
$ icacls $FILE /t /q /c /reset
$ icacls $FILE /t /q /c /grant :r Everyone:F
$ icacls $FILE /t /q /c /setowner Administrators
# ====
cmd> script.sh
OK .. invokes bash
getfacl script.sh
không?