foo.sh
我的当前目录中有一个文件。如果我尝试运行./foo.sh
,我会得到:
-bash: ./foo.sh: /bin/sh: bad interpreter: Permission denied
但如果我跑的/bin/sh ./foo.sh
话它就跑得很好。
我该如何解决这个问题,以便我可以运行./foo.sh
并且它会自动使用 /bin/sh 运行它?
编辑:好的,这是 Chrome 操作系统,这个特定的文件夹安装有noexec
.显然这会阻碍跑步的能力./foo.sh
;但为什么?为什么我仍然可以通过跑步sh foo.sh
来实现同样的目标?那么,它能noexec
带来什么安全感呢?
答案1
该noexec
标志将适当地应用于脚本,因为这将是“预期”行为。
然而,设置noexec
只会阻止那些对自己在做什么不够了解的人。当您运行时,sh foo.sh
您实际上是sh
从其默认位置(可能/bin
)运行,该位置不在使用noexec
.
您甚至可以noexec
通过直接调用来获取常规二进制文件ld
。
cp /bin/bash $HOME
/lib/ld-2.7.so $HOME/bash
这将运行 bash,无论它是否位于使用noexec
.
答案2
如果您尝试执行带有 MS-DOS 2 字节(回车换行)行结尾的文件,您也可能会收到此错误(或非常非常相似的消息)。
如今,Vim 非常智能,它不一定会将回车符显示为“^M”。因此,如果您不检查 Vim 认为的“文件格式”是什么而只依赖屏幕上的外观,您可能会被愚弄。
在这种情况下,“#!/bin/sh^M”导致内核尝试查找“/bin/sh^M”,但它找不到。确实是糟糕的翻译。
答案3
如果您可以选择从 USB 记忆棒(或其他可移动介质)运行脚本或程序,则可以尝试卸载并手动重新安装它:
插入 U 盘
查找 USB 记忆棒设备
$ mount
记下它;让我们假设它是
/dev/sdb1
卸载 U 盘:
$ cd /media/removable $ sudo umount mountpoint
最后,重新安装 U 盘:
$ sudo mount /dev/sdb1 mountpoint
使用 mountpoint USB 记忆棒的安装名称
答案4
我也有同样的问题。我的问题出在 SD 卡上。这对我有用,而且比这里的其他答案简单得多。我是从那里学到的油煎面包块问题 #928。
$ sudo mount -o remount,exec /media/removable/SD\ Card
请注意,您必须使用安装点,而不是设备 (/dev/mmcblk1p1)。对于您的情况,USB (/dev/sdb1) 也是如此。只是挂载点不同:
$ sudo mount -o remount,exec /media/removable/USB\ Drive
您会知道它达到了预期的效果,因为当您查询时“noexec”将从挂载选项中消失。