ld-2.17.so に実行権限がない場合、なぜ while ループがターミナルから機能するのでしょうか?

ld-2.17.so に実行権限がない場合、なぜ while ループがターミナルから機能するのでしょうか?

前回の質問では、「chmod 666 ld-2.17.so」を実行しました - どうすれば回復できますか?ld-2.17.so読み取り権限を変更すると、これらのライブラリを必要とするものをまったく実行できなくなるため、どうすれば元に戻せるのかと質問しました。

そして私は次のような答えを得ました。

書き込み可能な実行可能ファイルがある場合は、bash の read を使用して ld.so の内容をそのファイルにコピーできます。

while IFS= read -d '' -r line; do printf "%s\0" "$line"; done > executable-file < /lib64/ld-2.17.so

試してみたところ、うまくいきました。しかし、私が混乱しているのは、次のように、このwhileループ/bin/bash自体がライブラリを必要とするのになぜ機能するのかということです。lib64/ld-2.17.so

ldd /bin/bash
    linux-vdso.so.1 =>  (0x00007ffc54dee000)
    libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007f6fb9bbe000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00007f6fb99ba000)
    libc.so.6 => /lib64/libc.so.6 (0x00007f6fb95f6000)
    /lib64/ld-linux-x86-64.so.2 (0x000055ec142f5000)

bash誰か、なしでターミナルからコードが機能する理由を教えてください。権限がなくても、ターミナルから を/lib64/ld-2.17.so使用して空の実行可能ファイルを作成できるという意味ですか?bash/lib64/ld-2.17.so

ありがとう

答え1

while IFS= read -d '' -r line; do 
    printf "%s\0" "$line"
done > executable-file < /lib64/ld-2.17.so

シェルの組み込み機能のみを使用するため、新しいプロセスを開始する必要はありません。回復シナリオでは、シェルがすでに実行されていることを前提としています。すでに実行されているため、ディスク上の権限やライブラリの権限は関係ありません。

このような状況では新しいシェルを起動することはできませんが、現在実行中のものは変更された権限の影響を受けません。

読み込もうとしているファイルにいいえ権限、これはルート シェルにいる場合にのみ機能します。そうでない場合は、ルートでない限り読み取り不可能なファイルから読み取ることができないため、リダイレクトはld-2.17.so失敗します。(ここでは SELinux などは無視します。)

関連情報