SQLクエリまたはスズメ大砲からのPHPキャッシュのフラッシュ



良い一日。 ここでそのような問題に直面しました-SQLクエリを通じて、PHPキャッシュをリセットします。 特定のディレクトリにある複数のファイルを削除するだけです。 入り口にあります:



その結果、python + C + bashバンドル(すべてのビット)で解決策を得ました。 Unix系ではありませんが、誰かにとっては便利かもしれません。



PHPキャッシュ削除コマンドをbashスクリプトでラップし、新しい機能でさらに拡張することを考えています。 一般的に、目的のコマンドをパラメーターとして渡すとよいでしょう。 スクリプトは次のとおりです。

#!/bin/bash function __clear_cache() { rm /var/www/html/cache/*.php } FUNCS=() FUNCS+=("__clear_cache") function function_exists() { local e for e in "${@:2}"; do [[ "$e" == "$1" ]] && return 0; done return 1 } if function_exists "$1" "${FUNCS[@]}"; then eval "$1" else echo "Function $1 does not exists" exit 1 fi
      
      





ここでは、関数(コマンドなど)のリストを含む配列を宣言し、転送されたコマンド(関数など)を呼び出す前に、リストにあるかどうかを確認します。 そうでなければ、悪いユーザーはrm -rf ...のようなものをパラメーターとして渡すことができ、これはevalで成功します 。 このルートスクリプトの所有者を設定し(Apacheで十分ですが、注意を忘れずに拡張性を考えています)、スクリプトを実行します。

 chown root:root sysutils chmod ugo+x sysutils
      
      





このスクリプトは、DBMSからC(PostgreSQLへの拡張機能を作成する必要があるため長い道のり)またはアンマネージスクリプト言語(plpython)から実行できます。 しかし、最初に考えてみましょう-DBMSからのスクリプトはpostgresユーザーの権限で実行され、(少なくとも)apacheのみがキャッシュを削除できます。 しかし、それは問題ではありません。SUIDフラグなどがあります。 しかし問題は、LinuxではスクリプトのSUIDフラグを設定できないことです(詳細はこちら )。 むしろ、可能ですが、有効なユーザーIDは実際のユーザーIDと同じままです。 スクリプトを呼び出す小さなCプログラムを作成して、この制限を回避してみましょう。 彼女のコードは次のとおりです。

 #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <unistd.h> int main(int argc, char *argv[]) { setuid(0); char command[255]; if (argc == 2) { snprintf(command, 255, "/usr/local/bin/sysutils %s", argv[1]); system(command); } else { printf("USAGE: sysutils-core <command>\n"); } return 0; }
      
      





まず、有効なユーザーIDを設定し、次にパラメーター(必須コマンド)を渡してスクリプトを呼び出します。 プログラムをコンパイルし、SUIDフラグを設定します。

 gcc -o sysutils-core sysutils-core.c chmod u+s sysutils-core
      
      





私たちはチェックします:

 su postgres ./sysutils-core clear_cache
      
      





それでは、DBMSパートに移りましょう。



適切なデータベースでSQLコマンドを実行して、plpython3拡張機能(システムにプリインストールされている)をインストールします。

 CREATE EXTENSION plpython3u;
      
      





または、コンソールを使用して:

 createlang plpython3u -h localhost -U postgres testdb
      
      





キャッシュをリセットするDBMSの関数は次のようになります。

 CREATE OR REPLACE FUNCTION clear_cache ( ) RETURNS void AS $BODY$ import os os.system("/usr/local/bin/sysutils-core __clear_cache") $BODY$ LANGUAGE plpython3u VOLATILE;
      
      





これは、clear_cacheパラメーターを指定したsysutils-core呼び出しです。 私たちはチェックします:

 SELECT clear_cache ( );
      
      





必要に応じて、関数呼び出しはpostgres(アンマネージ言語で関数を作成できるのはこのユーザー)だけでなく、この場合、関数を作成するときにオプション-SECURITY DEFINER (DBMSのSUIDに類似)を指定する必要があります。



以上です。 必要に応じて、渡す引数、新しいコマンドを追加し、一般にDBMSを介してLinuxサーバーを管理できます。 宿題にしましょう。



UPD :Cプログラムのより安全なバージョン( execl経由):

非表示のテキスト
 #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <unistd.h> #include <error.h> #include <sys/wait.h> #include <errno.h> int main(int argc, char *argv[]) { setuid(0); if (argc == 2) { int status = 0; int pid = fork(); switch (pid) { case -1: printf("Fork sysutils process failed"); exit(1); case 0: execl("/bin/bash", "bash", "/usr/local/bin/sysutils", argv[1], NULL); default: wait(&status); } } else { printf("USAGE: sysutils-core <command>\n"); } return 0; }
      
      








All Articles