Chạy ./script.sh vs bash script.sh - quyền bị từ chối


43

Khi tôi cố chạy ./script.shtôi đã nhận Permission deniednhưng khi tôi chạy thì bash script.shmọi thứ đều ổn.

Tôi đã làm gì sai?


Bạn có thể chỉnh sửa câu hỏi để bao gồm nội dung của dòng shebang và đầu ra của getfacl script.shkhông?
Anthony G - công lý cho Monica

Câu trả lời:


49

Quyền POSIX không chính xác

Đ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.shhoặc . script.shchạ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.

Danh sách kiểm soát truy cập

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 getfacllệ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:

Hệ thống tập tin được gắn với tùy chọn noexec

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 noexectù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 /tmplàm ví dụ ở đây vì có những lý do bảo mật tốt để tiếp tục /tmpgắn kết với noexec,nodev,nosuidtập hợp các tùy chọn.


2
Tôi đặt chmod 777 và vẫn gặp lỗi này.
Piotr Stapp

2
Tôi không có exec trên phân vùng.
Piotr Stapp

Vì vậy, tôi đã không có người thực hiện và nó không được liệt kê trong fstab. Tại sao nó lại làm điều này với các phân vùng không phải là tmp của tôi?
Deryck

1
Đó là tùy chọn noexec trong / etc / fstab.
dùng208145

Tôi muốn thêm rằng cũng nên kiểm tra xem thư mục chứa tập lệnh có "thực thi" hay không (để nó có cờ X hay không). Nếu không, tập lệnh sẽ chỉ được người dùng root thực thi.
Letokteren

30

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.


2
Iwelcomme cho U & L, tôi định dạng lại theo quy ước, tuy nhiên điều này hầu như không thêm bất cứ điều gì vào câu trả lời trước đó.
Archemar

8
đôi khi, câu trả lời ngắn nhất là câu trả lời hay nhất :)
Sameera Kumarasingha 20/03/2017

1

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.