Bash 获取有关“的更多信息”;“拒绝许可”;

Bash 获取有关“的更多信息”;“拒绝许可”;,bash,permissions,Bash,Permissions,我在脚本上遇到“权限被拒绝”错误。我已经检查了所有的嫌疑犯: 我拥有这个文件和文件夹 两者都具有x权限 事实上,这两个都是所有者的rwx,而所有者就是我正在使用的用户 脚本shebang行是#/bin/sh我可以很好地执行它。但这是无关紧要的,因为它从未被解析过。在我当前的bash会话上设置-x,除了尝试执行脚本外,不会显示其他任何情况 我得到的错误是: $ path/script bash: path/script: Permission denied $ _ 编辑:如果我将脚本作为参数

我在脚本上遇到“权限被拒绝”错误。我已经检查了所有的嫌疑犯:

  • 我拥有这个文件和文件夹
  • 两者都具有
    x
    权限
  • 事实上,这两个都是所有者的
    rwx
    ,而所有者就是我正在使用的用户
脚本shebang行是
#/bin/sh
我可以很好地执行它。但这是无关紧要的,因为它从未被解析过。在我当前的bash会话上设置
-x
,除了尝试执行脚本外,不会显示其他任何情况

我得到的错误是:

$ path/script
bash: path/script: Permission denied
$ _
编辑:如果我将脚本作为参数传递,它可以正常工作

$ /bin/sh -x path/script
...script executes...

通过深入内核调用获取更多信息。如果您了解C语言和内核API,这会有所帮助<代码>人页面是你的朋友

查看是否有名为
strace
的程序,然后尝试
哪个strace
。在各种unix上都有类似的程序(比如在一些sun上有
truss
,在osx上有
dtrus
),但
strace
是最常见的。如果你找不到,用谷歌搜索“strace for…”之类的东西,不管你用的是什么UNIX

strace -o strace.out -f /bin/sh path/script
-o strace.out
表示跟踪文件
strace.out
-使用编辑器查看它

-f
表示遵循子流程

/bin/sh path/script
是您正在跟踪的程序

你将获得大量的输出,有时值得走到最后,向后工作

在Linux上还有
ltrace
,它也可以跟踪库调用

如果要跟踪的程序已经在运行,那么进程的
-p
选项和
pid
会非常方便


当然,尽管如此,在本例中,shell很可能报告了内核告诉它的所有信息。可能是因为没有进一步的信息提供。

好吧,这是一个愚蠢的原因。装载标志有
noexec
。但我仍然希望“获取有关“权限被拒绝”的更多信息”问题的答案是在装载上设置了
noexec
的装载文件系统上的
path/script
…我点击return,看到答案是“是”…没有办法获得更多信息;这就是shell拥有的所有信息,因为这是内核告诉shell的所有信息。您必须通过检查访问权限来调试它。您遵循了大多数正确的步骤。您没有告诉我们的是实际路径,它位于一个安装了
noexec
的文件系统上。不在机器上的任何人都不可能知道这一点——这是通过消除过程发现的。是的。正如我上面所说,这是被拒绝的最终原因。但我想知道如何实际获取更多信息,而不是每次都检查十几件事情……请注意,一般来说,ACL之类的东西确实会混淆问题。POSIX不是为提供更多信息而设计的。Jonathan是对的。内核没有说明原因。我得到:
execve(“路径/脚本”、[“路径/脚本”…]、/*36变量*/])=-1个EACCES(权限被拒绝)\n写入(2,“strace:exec:Permission denied\n”,32)=32\n退出组(1)=\n+++退出时带有1++
ltrace
抱怨它不是二进制elf。我还不熟悉ltrace。乔纳森通常(也许总是?)是对的。不管怎样,现在你知道如何了解真实情况了。应用程序通常不会报告全部情况,
strace
是一个很好的工具。使用
ltrace
,请确保指定可执行文件,而不仅仅是脚本名称(我在第一个版本的帖子中犯了一个错误,省略了/bin/sh)。绝对不是“总是正确的”,尽管我努力让它比“经常”更好。