Bash では、source
実行ビットを設定しなくてもスクリプトを実行できます。これは文書化され、予想される動作ですが、実行ビットの使用に違反しませんか?
わかりました、これはsource
サブシェルを生成しません。
答え1
答え2
Bashはインタプリタです。入力を受け取り、必要に応じて行います。実行可能ビットには注意を払う必要はありません。実際、Bashは移植可能で、実行可能なビットの概念なしにオペレーティングシステムとファイルシステムで実行できます。
実行可能ビットの管理はオペレーティングシステムのカーネルです。exec
たとえば、Linuxカーネルは、操作を実行するときにファイルシステムがオプションでnoexec
マウントされていないことを確認し、プログラムファイルの実行可能ビットを確認し、SELinuxやAppArmorなどのセキュリティモジュールによって課されるすべての要件を適用します。 。
実行可能ビットはややランダムなコントロールです。たとえば、Linux x86-64 システムでは、次のようにしてカーネルの実行可能ビットチェックをバイパスできます。/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
インタプリタとして明示的に呼び出される:
cp /bin/ls /tmp/
chmod -x /tmp/ls
/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 /tmp/ls
ld.so
これはインタプリタであり、実行されるコードがELF形式の機械語コードであることを除いて、BashからBashソースコードを取得するのと多少似ています。
答え3
nonsetuidファイルとnonsetguidファイルの実行可能ビット(他のビットとは異なり)はセキュリティメカニズムではありません。読みやすいもの、間接的に実行できます。 Linuxでは実行できますが、直接読み取ることができないすべてを間接的に読み取ることができます。 (これはset(g)uidではなくxビットが穴であるという概念を破るのに十分です。)安全対策)。
これがより便利です。ビットが設定されている場合はシステムに直接実行し、それ以外の場合は間接的に実行する必要があります(bash the_script;
または一部ハッカーは読み取り権限なしで実行可能ファイルのメモリイメージを取得します。)。
非リソースを内部化して実行する場合は、便宜のためにこれを設定できます。
ただし、明らかに多くの共有ライブラリ実装者があなたのアイデアに同意するので、多くのシステムで使用するには、共有ライブラリ(基本的にはシェルインソースケーブルと基本的に同じ)を実行可能としてマークする必要があります。バラより共有ライブラリが実行可能なのはなぜですか?。
答え4
オペレーティングシステムでは、シェルスクリプトを含むファイルは単なるデータです。これらのデータファイルの名前をコマンドに渡すか、コマンドラインsource
からbashシェル呼び出しに渡すと、オペレーティングシステムが見るすべては、データを含むファイル名と一致する文字列だけです。
この場合、実行ビットの関連性は何ですか?