web-dev-qa-db-ja.com

Chrome OSでは、Bashはスクリプトを実行しません。Bashにスクリプトを実行させるにはどうすればよいですか?

現在のディレクトリにfoo.shファイルがあります。 ./foo.shを実行しようとすると、次のようになります。

-bash: ./foo.sh: /bin/sh: bad interpreter: Permission denied

しかし、/bin/sh ./foo.shを実行すると、正常に実行されます。

これを修正して./foo.shを実行し、/ bin/shで自動的に実行できるようにするにはどうすればよいですか?

編集:さて、これはChrome OSであり、この特定のフォルダはnoexecでマウントされています。どうやら、これは./foo.shを実行するだけの機能を失いますが、なぜ?まったく同じことを達成するためにsh foo.shを実行できるのはなぜですか?では、noexecはどのようなセキュリティを提供しますか?

16
Ricket

noexecフラグはスクリプトに適切に適用されます。これは、「予想される」動作であるためです。

ただし、noexecを設定すると、何をしているのかを十分に理解していない人だけが停止します。 sh foo.shを実行すると、shでマウントされたファイルシステム上にないデフォルトの場所(おそらく/bin)から実際にnoexecを実行しています。

noexecを直接呼び出すことで、通常のバイナリファイルのldを回避することもできます。

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

これは、noexecでマウントされたファイルシステム上にあるかどうかに関係なく、bashを実行します。

22
bahamat

また、MS-DOSの2バイト(キャリッジリターンラインフィード)の行末でファイルを実行しようとすると、このエラー(または非常によく似たメッセージ)が発生することがあります。

最近のVimはとても賢いので、キャリッジリターンが '^ M'であるとは限りません。そのため、Vimが「ファイル形式」が何であると考えているかをチェックせず、画面上の外観に依存している場合、だまされる可能性があります。

この場合、「#!/ bin/sh ^ M」はカーネルが「/ bin/sh ^ M」を見つけようとしますが、それはできません。確かに悪い通訳。

5
Bruce Ediger

USBスティック(またはその他のリムーバブルメディア)からスクリプトまたはプログラムを実行するオプションがある場合は、アンマウントして手動で再マウントすることができます。

  1. USBスティックを差し込む

  2. $ mountでUSBスティックデバイスを探す

  3. それをメモしてください。 /dev/sdb1だとしましょう

  4. USBスティックをアンマウントします。

    $ cd /media/removable
    
    $ Sudo umount mountpoint
    

最後に、USBスティックを再マウントします。

$ Sudo mount /dev/sdb1 mountpoint

マウントポイントでは、USBスティックのマウント名

2

同じ質問がありました。私の問題はSDカードにありました。これは私にとってうまくいきました、そしてそれはここの他の答えよりもはるかに簡単です。私はそれを Crouton issue#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"がマウントオプションから消えるため、望ましい効果があったことがわかります。

0
tbc0