以下で何が起こっているのかを詳しく説明できる人はいますか?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_world
noexecファイルシステムオプションは明らかに望むほどスマートではありません。bash
runコマンドはファイルシステムにあり、そうではあり/bin/bash
ません。したがって、実行するには問題はありません。システムはbash(またはpython、perlなど)がインタプリタであるかどうかにかかわりません。単にユーザーが提供したコマンド()を実行し、引数はまさにファイルです。 Bashや他のシェルの場合、ファイルには実行するコマンドのリストが含まれていますが、ファイルの実行ビットを確認するためのエントリが「通過しました」。点検後に発生した問題は一切責任を負いません。/bin
noexec
/bin/bash
次の状況を考えてみましょう。
$ cat hello_world | /bin/bash
...または猫を無意味に使用するのが好きではない人のために:
$ /bin/bash < hello_world
#!
ファイルの先頭にある「shbang」シーケンスは、ファイルをコマンドとして実行しようとしたときに同じことを効果的に実行する素晴らしい魔法です。次のLWN.netの記事が役に立ちます。プログラムの仕組み。