Chrome OSでは、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 OSで、この特定のフォルダーはでマウントされていnoexecます。どうやらそれだけで実行する機能を妨げる./foo.sh; しかし、なぜですか?sh foo.shまったく同じことを達成するためにまだ実行できるのはなぜですか?それでは、どのようなセキュリティがnoexec提供されますか?


1
あいまいさによるセキュリティ
マイケルデュラント

「.foo.sh」の実行が機能する場合、試しましたか?
ダニエレテスタ

@DanieleTestaこの質問は、昔からの古代の遺物です。最初のChromebookの1つであるGoogle Cr-48を使用して、ChromeOSのかなり初期の(ただし安定した)バージョンを実行していました。それ以来、私たちは長い道のりを歩んできました。この質問が最新のChromeOSバージョンに当てはまるとは思いませんが、確かなことを言うために使ったことはありません。とにかく、あなたのバリエーションもうまくいくと思いますが、確かに言う前にそれをテストする必要があります。noexecその魔法がどのように機能するかについては、まだはっきりしていません。
リケット

回答:


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

2つのコマンドを試しました。「共有オブジェクトファイルを開けません:そのようなファイルまたはディレクトリはありません」-shはコピーされますが、bashは実行されているためです。そのため、/lib/ld-2.10.1.so $HOME/sh共有ライブラリの読み込み中に別のエラーを返しました/home/chronos/user/sh: failed to map segment from shared object: Operation not permitted。あなたの言ったことが間違っていたのか、それとも何か他のものが干渉しているのかはわかりません。たとえば、/は読み取り専用としてマウントされます。
リケット

まあ、試してみるべきChromeOSのコピーがないため、はっきりと言えませんでした。私はそれがいくつかの変更で機能することをかなり確信していますが、自分でそれを試すことができなければ、それが何であるかわかりません。
バハマ

まあ、Chrome OSが適切にロックダウンされているからだと思います。それはかなり安全であるように見えますが、私たちは時間をかけて見ると思います!
リケット

1
とには違いがldありld.soます。ldは、コンパイル時にバイナリを形成するためにオブジェクトコードをリンクする際に使用される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

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


1

ChromeOS / ChromiumOSのシステムセキュリティ上の理由により、特定のフォルダーがマークされてnoexecおり、次のコマンドで再マウントするかnoexec、2番目の例のように設定されていない代替パスを使用する必要があります。

これらのコマンドは、少なくとも開発者モードであり、sudoパスワードだけでなくshellwithにアクセスできることを前提としています。chronos@localhost / $crosh>

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/

ここでは、物事を置くのもう1つの利点は、それがであるということです$PATHすでに(してみてくださいecho $PATH、あなたがしているスクリプトまたはバイナリを実行するために完全なパスを使用する必要はありませんので、これを確認するため)/usr/local/binと持っていたchmod +xそれらの実行を。


2
こんにちは、Unix SEにようこそ!ここでは、単一コマンドの回答はあまりHQとは見なされません。あなたが何をしているのか、そしてその理由を説明することをお勧めします。
peterh -復活モニカ

0

同じ質問がありました。私の問題は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」がマウントオプションから消えるので、望ましい効果があることがわかります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.