26
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

これは、PostgreSQL Advent Calendar 2015のDay2の記事です。

今回は、PostgreSQL経由で、Hello WorldのCプログラムを書いてコンパイルして実行してみたいと思います。
PostgreSQLの接続ポートだけ開いているようなサーバ上でHello Worldしたいときに使えるテクニックです!!

以降のSQLは、すべてスーパーユーザで実行してください。

-- Hello Worldのソースを保存するテーブルを作成します。
CREATE TABLE hello_source (line serial, code text);

-- Hello WorldのCプログラムの実行結果を保存するテーブルを作成します。
CREATE TABLE hello_result (output text);

-- COPY FROM stdinで、Hello Worldのソースをhello_sourceテーブルに保存します。
COPY hello_source (code) FROM stdin;
#include <stdio.h>

int main(void)
{
    printf("Hello World !!\n");
    return 0;
}
\.

-- COPY TO PROGRAMで、Hello Worldのソースを/tmp/hello.cに保存し、gccでコンパイルします。
COPY (SELECT code FROM hello_source ORDER BY line) TO
  PROGRAM 'tee /tmp/hello.c; gcc -o /tmp/hello /tmp/hello.c';

-- Cプログラムを実行し、その結果をhello_resultテーブルに蓄積します。
COPY hello_result FROM PROGRAM '/tmp/hello';

-- 実行結果を確認してみましょう!!
SELECT * FROM hello_result;

注意

この例から分かるように、スーパーユーザは、PostgreSQL上のすべての操作だけでなく、任意のOSコマンドまで実行できてしまう非常に危険なユーザです。例えば、リモートからのスーパーユーザのログインを拒否するようにpg_hba.confを設定するなど、安易にはスーパーユーザが使われないようにしましょう!

26
21
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?