当我尝试跑步时,./script.sh
我得到了Permission denied
,但当我跑步时bash script.sh
一切都很好。
我做错了什么?
答案1
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 +rx script.sh
,这将为用户、组和其他人授予读取和执行权限。
然后尝试,./script.sh
.
答案3
在我的win7上,管理员运行cmd;我有与 cygwin64/bin/bash 关联的 .sh 文件,但它被 cmd 阻止了。上述建议都没有帮助(chmod、setfacl、mount)。
下面的解决方案有效,每当 win7 上的管理员无法访问文件夹/文件时,它就是一个管理员大锤 acl 修复程序,这通常是):
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
答案4
Permission denied
如果当您尝试在 docker 的入口点中运行脚本时仍然遇到错误,请尝试不要使用壳形入口点的:
而不是:
ENTRYPOINT ./bin/watcher
写ENTRYPOINT ["./bin/watcher"]
:
https://docs.docker.com/engine/reference/builder/#entrypoint