Redisは、このようなキーと値のビューリポジトリです。 環境変数-同じに似ています。 しかし、それが何らかの形で組み合わされた場合はどうなりますか?
金曜日の投稿、複雑でないハッキング、奇妙な欲望のファンのために-私はカットをお願いします
ほとんどすべてのプログラミング言語のRedisのクライアントライブラリの印象的なリストがあります。 しかし、もしも:
- 変更には適さない既存のアプリケーションが既に存在します。
- Redisを使用する場合と使用しない場合の両方で機能するアプリケーションを作成する必要があります。
- シンプルな方が良いです。 多くの場合、キャッシュの操作は本質的に補助的なものであり、アプリケーションに不要な複雑さをもたらします。
私の場合、状態を維持する必要がある次のCGIのようなサービスの作成後に問題が発生しました。 同時に、このスクリプトの実行は異なるマシンで発生する可能性があります。
午前2時に約1時間で、私にとってはすでに金曜日だったので、リラックスしてシンプルで面白いことをすることにしました。
質問とアイデア
システムコールをインターセプトして、環境変数( setenv
)に書き込むときにデータが
はRedisに書き込まれましたが、読み取られたとき( getenv
)、逆にキャッシュから抜けましたか?
概略的には次のようになります。
Application <-- [syscall]--> [Wrapper] <-- [GET/DEL/...] --> [Redis]
リサーチ
可能ですか?
はい、システムコールインターセプターの作成方法を説明した優れた記事があります。
誰かが接続を初期化する必要があります...
共有ライブラリーで初期化(コンストラクター)およびファイナライズ(デストラクター) の機能を指定する機会が少しあります 。 それらに接続されます。
実装
このトピックについては、POSIX'aおよびLinux'aの仕様を検討する必要がありました。
インターセプトされる関数:
-
putenv
-
setenv
-
getenv
-
secure_getenv
-
clearenv
-
unsetenv
コードはこちらです。
依存関係
- C11
- ハイレディス0.13
組立
トリックはありません-Githubでの典型的なCMake
依存関係
sudo apt install libhiredis-dev cmake build-essential
組立
git clone https://github.com/reddec/envredis.git cd envredis mkdir build && cd build cmake -DCMAKE_BUILD_TYPE=Release ../ && make
使用する
重要な点:一部のアプリケーションは環境変数を変更せず、内部配列のみを変更します。 そのようなアプリケーションでは、Redisからのデータは取得されますが、表示されません。
適切なオプションはpythonです。 ドキュメントによると、 os.environ
の変更は環境変数に表示されます。
Redisが既にローカルマシンで発生しているとします。
- 変数
XYZ
出力を実行します
$ python -c 'import os; print("XYZ=" + os.environ.get("XYZ", ""))' # : # XYZ=
- Redisで変数を設定する
$ redis-cli SET XYZ "Hello world" # : # OK
- インターセプターと一緒に実行する
LD_PRELOAD=/path/to/libenvredis.so python -c 'import os; print("XYZ=" + os.environ.get("XYZ", ""))' # # XYZ=Hello world
- それでは、変数を設定してみましょう
LD_PRELOAD=/path/to/libenvredis.so python -c 'import os; os.environ["SAY"] = "Bye!"'
- Redisに表示されることを確認します
redis-cli GET SAY # # "Bye!"
PS
タスクは、対象領域の研究を考慮して、約2時間かかりました。 実際の目的よりもファンのために多くのことが行われます。
それにもかかわらず、誰かが役に立つかもしれません。