ファイルシステムでbashスクリプトまたはacバイナリを実行するには、noexecオプションを使用します。

ファイルシステムでbashスクリプトまたはacバイナリを実行するには、noexecオプションを使用します。

以下で何が起こっているのかを詳しく説明できる人はいますか?noexec次のオプションを使用してディレクトリをマウントするとします。

mount -o noexec /dev/mapper/fedora-data /data

だからこれを確認するために、私は以下を実行しましたmount | grep data

/dev/mapper/fedora-data on /data type ext4 (rw,noexec,relatime,seclabel,data=ordered)

今、私は次の/data簡単なスクリプトを作成していますhello_world

#!/bin/bash

echo "Hello World"
whoami

だから私はスクリプトを実行可能にしchmod u+x hello_world(しかし、これはoptionsのあるファイルシステムには影響しませんnoexec)実行してみました。

# ./hello_world
-bash: ./hello_world: Permission denied

ただし、bashファイルを前処理すると、次のようになります。

# bash hello_world
Hello World
root

hello_world.cその後、次の内容で簡単なものを作成しました。

#include <stdio.h>

int main()
{
    printf("Hello World\n");
    return 0;
}

以下を使用してコンパイルします。 cc -o hello_world hello_world.c

次に、次を実行します。

# ./hello_world
-bash: ./hello_world: Permission denied

だから私はそれを使って実行してみました。

/lib64/ld-linux-x86-64.so.2 hello_world

間違い:

./hello_world: error while loading shared libraries: ./hello_world: failed to map segment from shared object: Operation not permitted

もちろん、ldd次が返されるので、これは正しいです。

ldd hello_world
ldd: warning: you do not have execution permission for `./hello_world'
    not a dynamic executable

noexecマウントオプションが適用されない他のシステムでは、以下が表示されます。

ldd hello_world
    linux-vdso.so.1 (0x00007ffc1c127000)
    libc.so.6 => /lib64/libc.so.6 (0x00007facd9d5a000)
    /lib64/ld-linux-x86-64.so.2 (0x00007facd9f3e000)

今私の質問は、オプションのファイルシステムでbashスクリプトを実行するとうまくいきますnoexecが、cコンパイルされたプログラムが機能しないのはなぜですか?後ろで何が起こるのか?

ベストアンサー1

どちらの場合も、発生する状況は同じです。ファイルを直接実行するには実行ビットを設定する必要があり、ファイルシステムはnoexecを使用してマウントできません。しかし、これらのことは何も妨げません。読むその文書。

Bashスクリプトが実行され、./hello_worldファイルが実行可能でない場合(exec権限ビットがないか、ファイルシステムにnoexecがない)、次の行#!が表示されます。確認もしませんでした。これは、システムがファイルをロードしないためです。スクリプトは関連する意味では決して「実行」されません。

この場合、bash ./hello_worldnoexecファイルシステムオプションは明らかに望むほどスマートではありません。bashrunコマンドはファイルシステムにあり、そうではあり/bin/bashません。したがって、実行するには問題はありません。システムはbash(またはpython、perlなど)がインタプリタであるかどうかにかかわりません。単にユーザーが提供したコマンド()を実行し、引数はまさにファイルです。 Bashや他のシェルの場合、ファイルには実行するコマンドのリストが含まれていますが、ファイルの実行ビットを確認するためのエントリが「通過しました」。点検後に発生した問題は一切責任を負いません。/binnoexec/bin/bash

次の状況を考えてみましょう。

$ cat hello_world | /bin/bash

...または猫を無意味に使用するのが好きではない人のために:

$ /bin/bash < hello_world

#!ファイルの先頭にある「shbang」シーケンスは、ファイルをコマンドとして実行しようとしたときに同じことを効果的に実行する素晴らしい魔法です。次のLWN.netの記事が役に立ちます。プログラムの仕組み

おすすめ記事