インタプリタバイナリを設定せずにスクリプトで関数を使用できますか?

インタプリタバイナリを設定せずにスクリプトで関数を使用できますか?

これでcap_net_bind_service MY_USERNAME/etc/security/capability.confで使用しています。今私が好きなスクリプト言語のインタプリタを
設定してそれを追加するだけです。cap_net_bind_service+iCAP_NET_BIND_SERVICE効果的なlibcap[-ng]で設定します。

これはうまくいきますが、インタプリタバイナリに何の制限も設定せずに同じ結果を得る方法があるかどうか疑問に思います。これは大きな問題ではありませんが(他のユーザーアカウントには制限がないため、インタプリタバイナリにビットが設定されていても使用できません)、毎回フラグをリセットする必要があるため、少し迷惑です。通訳が開かれました。更新。

ベストアンサー1

多くの場合、これらの能力は子供に渡されます。で述べたようにマンページ:

fork(2)によって生成された子は、親機能セットのコピーを継承します。

スクリプトの問題は、直接実行できないことです。カーネルは一連のチェックを実行します(カーネルコードはfs / binfmt_ * .cにあります)。そのうちの1つは、最初の行にshebangがあることを確認してから、スクリプトを引数として使用して実際のインタプリタ(shebangのインタプリタ)を呼び出す "binfmt_script.c"です。したがって、標準/ユニバーサルインタプリタが呼び出され、スクリプトが引数として読み取られます。

これは、スクリプトではなくインタプリタで機能を設定する必要があることを意味します。suidビットやその他の特殊フラグにも同じ内容が適用されます。

したがって、通訳者をコピーし、必要な機能を設定して(誰もchmod / chownを介してアクセスできないことを確認してください)、コピーされた通訳者をshebangから呼び出します。スクリプトでsetcapロジックを実行することもできます。

おすすめ記事