現在のディレクトリに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
はどのようなセキュリティを提供しますか?
noexec
フラグはスクリプトに適切に適用されます。これは、「予想される」動作であるためです。
ただし、noexec
を設定すると、何をしているのかを十分に理解していない人だけが停止します。 sh foo.sh
を実行すると、sh
でマウントされたファイルシステム上にないデフォルトの場所(おそらく/bin
)から実際にnoexec
を実行しています。
noexec
を直接呼び出すことで、通常のバイナリファイルのld
を回避することもできます。
cp /bin/bash $HOME
/lib/ld-2.7.so $HOME/bash
これは、noexec
でマウントされたファイルシステム上にあるかどうかに関係なく、bashを実行します。
また、MS-DOSの2バイト(キャリッジリターンラインフィード)の行末でファイルを実行しようとすると、このエラー(または非常によく似たメッセージ)が発生することがあります。
最近のVimはとても賢いので、キャリッジリターンが '^ M'であるとは限りません。そのため、Vimが「ファイル形式」が何であると考えているかをチェックせず、画面上の外観に依存している場合、だまされる可能性があります。
この場合、「#!/ bin/sh ^ M」はカーネルが「/ bin/sh ^ M」を見つけようとしますが、それはできません。確かに悪い通訳。
USBスティック(またはその他のリムーバブルメディア)からスクリプトまたはプログラムを実行するオプションがある場合は、アンマウントして手動で再マウントすることができます。
USBスティックを差し込む
$ mount
でUSBスティックデバイスを探す
それをメモしてください。 /dev/sdb1
だとしましょう
USBスティックをアンマウントします。
$ cd /media/removable
$ Sudo umount mountpoint
最後に、USBスティックを再マウントします。
$ Sudo mount /dev/sdb1 mountpoint
マウントポイントでは、USBスティックのマウント名
同じ質問がありました。私の問題は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"がマウントオプションから消えるため、望ましい効果があったことがわかります。