在 Chrome 操作系统中,Bash 不会执行我的脚本。如何让 Bash 运行我的脚本?

在 Chrome 操作系统中,Bash 不会执行我的脚本。如何让 Bash 运行我的脚本?

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 记忆棒(或其他可移动介质)运行脚本或程序,则可以尝试卸载并手动重新安装它:

  1. 插入 U 盘

  2. 查找 USB 记忆棒设备$ mount

  3. 记下它;让我们假设它是/dev/sdb1

  4. 卸载 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”将从挂载选项中消失。

相关内容