環境を設定するopenssh / telnetコードでは、次のものを使用しています。
setenv("TEST_ENV", "testing", 1);
ただし、これはユーザーが変更できます。読み取り専用の環境変数にする方法はありますか?
答え1
ルーチンには何もありませんプロセス環境変数を読み取り専用にするには、シェルだけが独自の環境/変数に関するこの概念を持っています(どちらも重複していますが、異なることを理解する必要があります)。同じように適用されますタイプ整数、配列、関数などの属性
たとえば、制限されたシェルの使用を考えてみましたかrbash
?起動スクリプトで実行するように設定することができますrbash
。)あまりにも制限的かもしれませんが、コメントで発生した問題を主に解決します。readonly TEST_ENV
rbash
環境は各プロセスの読み取り/書き込み部分です(参照:ここそしてここ詳細)、プロセスは(を通じて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()
bash
environ[]
getenv()
答え2
このコマンドを使用して、POSIX互換シェルで読み取り専用変数を設定できますreadonly
。
readonly VAR=foo # POSIX
declare -r VAR=foo # bash
export VAR
これは、ユーザーの変更を防ぐセキュリティ機能ではありません。ユーザーはいつでも新しいシェルを作成して変数を変更できます。
答え3
/etc/skel/.bashrc
または、ユーザーごとに設定できます。~/.bashrc
readonly TEST_ENV