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


16

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
默默无闻来确保安全
Michael Durrant

您是否尝试过运行“。foo.sh”?
Daniele Testa

@DanieleTesta这个问题是一个很久以前的古老遗物。我使用的是Google Cr-48,它是最早的Chromebook之一,运行的是相当早期(但稳定)的ChromeOS版本。从那以后我们已经走了很长一段路,我认为这个问题不会适用于最新的ChromeOS版本,但是我没有肯定地说过。无论如何,我认为您的变体形式也可以奏效,但是应该先进行测试,然后再肯定地说。我仍然不清楚noexec它的魔术到底是如何工作的。
莉吉特

Answers:


22

noexec标志将适当地应用于脚本,因为这将是“预期的”行为。

但是,设置noexec只会阻止对自己的工作不了解的人。当您运行时sh foo.sh,实际上是sh从其默认位置(可能是/bin)运行,该默认位置不在使用挂载的文件系统上noexec

您甚至可以直接noexec调用常规二进制文件ld

cp /bin/bash $HOME
/lib/ld-2.7.so $HOME/bash

不管它是否在使用挂载的文件系统上,它都将运行bash noexec


5
+1(提及)ld.so(聪明)
amphetamachine '02

我尝试了您的两个命令;“无法打开共享库文件:没有这样的文件或目录”-由于正在复制sh但正在运行bash。因此,我尝试了一下,/lib/ld-2.10.1.so $HOME/sh并在加载共享库时返回了另一个错误:/home/chronos/user/sh: failed to map segment from shared object: Operation not permitted。我不确定您说的是不真实的,还是其他干扰。例如,/被安装为只读。
Ricket

好吧,我不确定,因为我没有可尝试的ChromeOS副本。我非常有信心它可以进行一些修改,但是如果我自己不能尝试的话,我不知道这可能是什么。
bahamat 2011年

哦,我想想这是因为Chrome操作系统已正确锁定。它似乎确实很安全,但是随着时间的流逝,我想我们会看到的!
Ricket

1
ld和之间有区别ld.sold是一个链接器,用于在编译时链接目标代码以形成二进制文件,而ld.so运行时链接器在执行程序时执行类似的操作。此处所指的链接器是运行时链接器。
库沙兰丹

5

如果您尝试执行带有MS-DOS 2字节(回车换行符)行尾的文件,也可能会收到此错误(或非常类似的消息)。

如今,Vim非常聪明,以至于不一定会将回车符显示为'^ M'。因此,如果您不检查Vim认为“文件格式”是什么,而仅依赖于屏幕上的外观,则可能会上当。

在这种情况下,“#!/ bin / sh ^ M”会导致内核尝试找不到“ / bin / sh ^ M”。确实是不好的翻译。


2

如果您可以选择从USB记忆棒(或其他可移动媒体)运行脚本或程序,则可以尝试卸载并手动重新安装它:

  1. 插入USB记忆棒

  2. 用以下命令找到USB记忆棒设备 $ mount

  3. 注意它;让我们假设它是/dev/sdb1

  4. 卸下USB记忆棒:

    $ cd /media/removable
    
    $ sudo umount mountpoint

最后,重新安装USB记忆棒:

$ sudo mount /dev/sdb1 mountpoint

使用mountpoint USB记忆棒的安装名称


1

出于系统安全原因,ChromeOS / ChromiumOS上标记了某些文件夹noexec,您需要使用以下命令重新挂载,或者使用未noexec设置的替代路径,如第二个示例。

这些命令假定您至少处于开发人员模式,并且可以使用shellwith chronos@localhost / $而不是just crosh>知道sudo密码。

sudo mount -i -o remount,exec /home/chronos/user/

由于Google /usr/local为开发人员保留了大部分资源,因此该方法应该在升级后仍然可持续发展,

sudo mkdir -p /usr/local/bin/ && sudo chown -R chronos: /usr/local/bin/
cp ${HOME}/Downloads/foo.sh /usr/local/bin/

把这边的事情的另一个好处是,它是在$PATH已经(尽量echo $PATH证实了这一点),所以你并不需要使用完整路径来运行在脚本或二进制文件/usr/local/bin,并已chmod +x在它们上面运行。


2
嗨,欢迎使用Unix SE!请注意,单命令答案在这里不是很总部。我建议解释一下,你在做什么,为什么。
peterh-恢复莫妮卡

0

我有同样的问题。我的问题出在SD卡上。这对我有用,并且比这里的其他答案要简单得多。我从Crouton第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”将从挂载选项中消失。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.