运行./script.sh vs bash script.sh-权限被拒绝


Answers:


49

POSIX权限不正确

这意味着您没有为设置执行许可位script.sh。运行时bash script.sh,您仅需要具有的读取权限script.sh。请参阅运行“ bash script.sh”和“ ./script.sh”有什么区别?有关更多信息。

您可以通过运行进行验证ls -l script.sh

您甚至不需要启动新的Bash进程。在许多情况下,您可以简单地在当前的交互式shell中运行source script.sh. script.sh运行脚本命令。如果脚本更改了当前目录或以其他方式修改了当前进程的环境,则可能要启动一个新的Bash进程。

访问控制列表

如果正确设置了POSIX权限位,则可能已配置了访问控制列表(ACL),以防止您或您的组执行文件。例如,POSIX权限将指示测试Shell脚本是可执行的。

$ ls -l t.sh
-rwxrwxrwx+ 1 root root 22 May 14 15:30 t.sh

但是,尝试执行文件会导致:

$ ./t.sh
bash: ./t.sh: Permission denied

getfacl命令显示原因:

$ getfacl t.sh
# file: t.sh
# owner: root
# group: root
user::rwx
group::r--
group:domain\040users:rw-
mask::rwx
other::rwx

在这种情况下,我的主要组是domain users通过将ACL限制为而撤消了执行权限sudo setfacl -m 'g:domain\040users:rw-' t.sh。可以通过以下任一命令取消此限制:

sudo setfacl -m 'g:domain\040users:rwx' t.sh
sudo setfacl -b t.sh

看到:

使用noexec选项挂载的文件系统

最后,在这种特定情况下,无法运行脚本的原因是该脚本所在的文件系统已通过noexec选件安装。此选项将覆盖POSIX权限,以防止执行该文件系统上的任何文件。

可以通过运行mount列出所有已挂载的文件系统进行检查。安装选项在文件系统对应条目的括号中列出,例如

/dev/sda3 on /tmp type ext3 (rw,noexec)

您可以将脚本移动到另一个已挂载的文件系统,也可以重新挂载该文件系统以允许执行:

sudo mount -o remount,exec /dev/sda3 /tmp

注意:我/tmp这里用作示例,因为出于良好的安全考虑,必须保持/tmp使用这noexec,nodev,nosuid组选项。


2
我设置chmod 777仍然有此错误。
Piotr Stapp 2015年

2
我在分区上没有exec。
Piotr Stapp,2015年

因此,我该死的没有exec,并且它不在fstab中列出。为什么对我拥有的非tmp分区执行此操作?
Deryck

1
是/ etc / fstab中的noexec选项。
user208145

我想补充一点,检查包含脚本的文件夹是否“可执行”(因此它带有X标志)也很明智。如果不是,则该脚本只能由root用户执行。
Letokteren

30

尝试

chmod 755 script.sh

这将使文件可执行。然后尝试

./script.sh

希望这会起作用。


2
我对U&L表示欢迎,我按照惯例重新格式化,但这几乎不能为先前的答案添加任何内容。
Archemar

8
有时候,最短的答案是最好的答案:)
Sameera Kumarasingha

1

在管理员运行cmd的win7上;我有与cygwin64 / bin / bash相关的.sh文件,但被cmd阻止。以上建议均无帮助(chmod,setfacl,mount)。

下面的解决方案有效,它是一个管理员大锤acl修复程序,只要在Win7上无法访问文件夹/文件,这是经常发生的):

  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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.