読み取り専用環境変数を設定する方法はありますか?

読み取り専用環境変数を設定する方法はありますか?

環境を設定するopenssh / telnetコードでは、次のものを使用しています。

setenv("TEST_ENV", "testing", 1);

ただし、これはユーザーが変更できます。読み取り専用の環境変数にする方法はありますか?

ベストアンサー1

ルーチンには何もありませんプロセス環境変数を読み取り専用にするには、シェルだけが独自の環境/変数に関するこの概念を持っています(どちらも重複していますが、異なることを理解する必要があります)。同じように適用されますタイプ整数、配列、関数などの属性

たとえば、制限されたシェルの使用を考えてみましたかrbash?起動スクリプトで実行するように設定することができますrbash。)あまりにも制限的かもしれませんが、コメントで発生した問題を主に解決します。readonly TEST_ENVrbash

環境は各プロセスの読み取り/書き込み部分です(参照:ここそしてここ詳細)、プロセスは(を通じてenviron[])データセクションに直接書き込むだけでなく、それへのポインタを変更することもできます。アセンブリに精通していてスタートコードの方法を見つけることができれば、これについて何かをすることができますが(例:読み取り専用ページに行く)、それはcrtお勧めできません。

ユーザーが実行する特定のコマンドに特定の環境が必要な場合は、グループの実行を設定し、それを使用してsudo正しい変数(/etc/environmentまたはenv_fileディレクティブなど)を設定し、特定のグループでコマンドを実行できます(uidを保持)。最新バージョンはnoexecほとんどのプラットフォームをサポートし、新しいシェルが実行されるのを防ぐために使用できます(適切なプログラムが破損する可能性がありますがfork()exec()

最後のオプションとして、独自のライブラリLD_PRELOADを使用して、関連するlibc関数などをラップして、一部/全ユーザープロセスの制御環境を設定できますgetenv() putenv()libfaketime時間関連のlibc関数はすぐにこれを行います。というよく知られていないツールがあります。時間旅行実は似ていますが、返品逆境の中でも制御力を維持するsetenv()ためのフックです。getenv()LD_PRELOAD

最も信頼できるアプローチは、呼び出しをフィルタリングして変更を防ぎ、常に必要な値(おそらくファイルから)を返すようにフィルタリングするsetenv() unsetenv() putenv()ことです。このアプローチは環境メモリの直接操作を防ぎませんが、libc APIに依存するプロセスを制御するたびに値を確認する必要があります。初期化中に直接使用されますが、呼び出されることもあります。clearnv()getenv()environ[]getenv()bashenviron[]getenv()

おすすめ記事