foo.sh我的当前目录中有一个文件。如果我尝试运行./foo.sh,我会得到:
-bash: ./foo.sh: /bin/sh: bad interpreter: Permission denied
Run Code Online (Sandbox Code Playgroud)
但是如果我运行,/bin/sh ./foo.sh那么它运行良好。
我该如何解决这个问题,以便我可以运行./foo.sh它并自动使用 /bin/sh 运行它?
编辑:好的,这是 Chrome 操作系统,此特定文件夹使用noexec. 显然,这阻碍了跑步的能力./foo.sh;但为什么?为什么我仍然可以运行sh foo.sh以实现完全相同的目标?那么,什么安全noexec呢?
bah*_*mat 22
该noexec标志将适当地应用于脚本,因为那将是“预期的”行为。
但是,设置noexec只会阻止对自己在做什么不够了解的人。当您运行时,sh foo.sh您实际上是sh从其默认位置(可能/bin)运行,该位置不在安装有noexec.
您甚至可以noexec通过ld直接调用来绕过常规二进制文件。
cp /bin/bash $HOME
/lib/ld-2.7.so $HOME/bash
Run Code Online (Sandbox Code Playgroud)
这将运行 bash,无论它是否在安装有 .bashrc 的文件系统上noexec。
如果您尝试执行带有 MS-DOS 2 字节(回车换行)行结尾的文件,您也会收到此错误(或非常非常相似的消息)。
现在 Vim 非常聪明,它不一定会向您显示回车符为 '^M'。因此,如果您不检查 Vim 认为的“文件格式”是什么而仅依赖屏幕外观,您可能会被愚弄。
在这种情况下,“#!/bin/sh^M”会导致内核尝试找到“/bin/sh^M”,但它不能。确实是糟糕的翻译。