Redisで環境変数を表示する


Redisは、このようなキーと値のビューリポジトリです。 環境変数-同じに似ています。 しかし、それが何らかの形で組み合わされた場合はどうなりますか?


金曜日の投稿、複雑でないハッキング、奇妙な欲望のファンのために-私はカットをお願いします


ほとんどすべてのプログラミング言語のRedisのクライアントライブラリの印象的なリストがあります。 しかし、もしも:


  1. 変更には適さない既存のアプリケーションが既に存在します。
  2. Redisを使用する場合と使用しない場合の両方で機能するアプリケーションを作成する必要があります。
  3. シンプルな方が良いです。 多くの場合、キャッシュの操作は本質的に補助的なものであり、アプリケーションに不要な複雑さをもたらします。

私の場合、状態を維持する必要がある次のCGIのようなサービスの作成後に問題が発生しました。 同時に、このスクリプトの実行は異なるマシンで発生する可能性があります。


午前2時に約1時間で、私にとってはすでに金曜日だったので、リラックスしてシンプルで面白いことをすることにしました。


質問とアイデア


システムコールをインターセプトして、環境変数( setenv )に書き込むときにデータが
はRedisに書き込まれましたが、読み取られたとき( getenv )、逆にキャッシュから抜けましたか?


概略的には次のようになります。


 Application <-- [syscall]--> [Wrapper] <-- [GET/DEL/...] --> [Redis] 

リサーチ


可能ですか?


はい、システムコールインターセプターの作成方法を説明した優れた記事があります。


誰かが接続を初期化する必要があります...


共有ライブラリー初期化(コンストラクター)およびファイナライズ(デストラクター) の機能を指定する機会少しあります 。 それらに接続されます。


実装


このトピックについては、POSIX'aおよびLinux'aの仕様を検討する必要がありました。


インターセプトされる関数:



コードはこちらです。


依存関係



組立


トリックはありません-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が既にローカルマシンで発生しているとします。



 $ python -c 'import os; print("XYZ=" + os.environ.get("XYZ", ""))' #   : # XYZ= 


 $ 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-cli GET SAY #   # "Bye!" 

PS


タスクは、対象領域の研究を考慮して、約2時間かかりました。 実際の目的よりもファンのために多くのことが行われます。


それにもかかわらず、誰かが役に立つかもしれません。




Source: https://habr.com/ru/post/J344766/


All Articles