CGIの 作 成 プログラミング 演 習
演 習 開 始 前 の 確 認 事 項 1. パスワード 無 しでcstmsへログイン スライド 3 2. cstms 上 にウェブページを 作 成 スライド 4 3. CGI 作 業 のディレクトリを 作 る スライド 9 2
1. パスワード 無 しでcstmsへログイン 1. 順 2. $ hostname と 3. mv4b のような 端 末 名 が 出 される 4. $ ssh cstms と 5. ここで Password: (パスワードを )と 表 されたら 準 備 不 6. $ hostnameと 7. cstms と 表 されたら 準 備 完 了 8. $ logout 9. $ hostname 10. 再 び mv4b と 表 される 2015/04/08 sshのスライドへ 戻 る 3
cstms 上 にウェブページを 作 成 ウェブブラウザを ち 上 げる 各 の 学 番 号 に 対 応 する http://cstms/~s1431987/2015programming.html を 表 1431987の 部 分 は 分 の 学 番 号 へ 置 き 換 える 各 のウェブページが ブラウザ 上 に 表 されて いれば 準 備 完 了 404 page not found や ページが 表 されない 時 準 備 不 次 のページ(1)(2)を 実 4
準 備 (1) $ ssh cstms sshの 設 定 が 終 わっていなければ の 前 の 端 末 にログイ ンのと 同 のユーザー 名 (s1431xxx, password)を 使 う $ pwd /home/cs/s1431xxx $ mkdir p public_html/cgi bin 5
準 備 (2) $ pwd /home/cs/s1431xxx $ emacs nw public_html/2015programming.html <html><head><title>1431987</title></head> <body><h1>1431987, 太 郎 </h1> <p> </p> </body></html> を 最 低 限 書 いて 保 存 終 了 ブラウザでファイルを 読 み 込 んで 確 認 $ logout 6
ブラウザで 表 されない 時 の 確 認 事 項 1. ブラウザのプロキシ(proxy)を 時 的 に 使 しない にしな いとアクセスできないかもしれない 2. あるいは 3. ブラウザのプロキシ(proxy)を 使 しないサイト 覧 に cstms を 追 加 する 4. ブラウザでアクセスできないときは ファイルとディレクトリの 読 み 込 み 権 限 を 確 認 する $ ssh cstms $ chmod 755 public_html $ chmod 755 pubic_html/cgi-bin $ chmod 644 public_html/2015programming.html $ logout 7
ローカル 端 末 編 集 と 動 化 確 認 $ ssh cstms と しパスワード 無 しでログイン できる ブラウザで http://cstms/~s1431987/2015programming.htmlを 表 すると 分 の 書 いた 内 容 が 表 される 8
CGI 作 業 のディレクトリを 作 る ローカルの 端 末 で 作 業 する $ hostname mv4a のような 表 がされる cstmsでは 無 い $ cd $ pwd /home/cs/s1431987 のような 表 がされる $ mkdir 2015-cgi (2015-cgiの 部 分 は 分 で 決 める) $ cd 2015-cgi $ scp cstms:/home/cs/s1431987/public_html/2015programming.html./ 9
前 から 続 き $ ls 2015programming.html $ emacs nw Makefile # Makefile for CGI * Coding: utf 8 unix * helloworld: helloworld.c gcc o helloworld.cgi helloworld.c scp helloworld.cgi cstms:/home/cs/s1431987/public_html/cgi bin/helloworld.cgi scp 2015programming.html cstms:/home/cs/s1431987/public_html/2015programming.html ssh cstms chmod 755 /home/cs/s1431987/public_html/cgi bin/helloworld.cgi ssh cstms chmod 644 /home/cs/s1431987/public_html/2015programming.html というファイルを 作 り 保 存 終 了 する 10
前 から 続 き $ ls Makefile 2015programming.html $ cd $ pwd /home/cs/s1431987 などと 表 $ cd git.works $ cd se $ git pull 11
CGI http serverのプログラミング
Common Gateway Interface, CGI ウェブサーバ 上 でユーザプログラムを 動 作 させるための 仕 組 み ユーザプログラムを 毎 回 起 動 するので OSにとって 負 荷 が い 回 避 策 として Java Servlet, mod_php, mod_perl, mod_lisp, FastCGI, WSGI(phyton)など ユーザプログラムのインタプリタを 別 途 起 動 しておく 法 がある 13
ウェブブラウザとウェブサーバ 1 http://www.it chiba.ac.jp/index.html 2 例 えば, GET HTTP 1.1 /index.html request Web Browser Web Server index.html response 3 例 えば, Content Type: text/html <html><head><title> 千 葉 業 学 </title></head> <body><h1>オープンキャンパス</h1> 14
CGIの 出 1. Web BrowserがCGIプログラムのリンクをクリックする 2. Web ServerがCGIプログラムを 起 動 する 3. CGIプログラムは,Web Serverを 通 じて ヘッダ 情 報 とコンテンツをWeb Browserへ 送 る 1 2 Web Browser 3 Web Server 3 CGI プログ ラム ヘッダ 情 報 例 えば, Content Type: text/html コンテンツ <html><head><title> 千 葉 業 学 </title></head> <body><h1>オープンキャンパス</h1> 15
CGIの 作 成 helloworld.c ヘッダ 情 報 コンテンツ #include <stdio.h> int main(void) { printf("content type: text/html n"); printf(" n"); ヘッダ 情 報 の 送 信 の 後 に, 2 回 の 改 が 必 要 (http, Hyper Text Transfer Protocol) printf("<html><head><title>hello World</title></head> n"); printf("<body> n"); printf("<h1>hello World</h1> n"); printf("<p>hello World from cgi bin/helloworld</p> n"); printf("</body></html> n"); return 0; } 16
FORMの 処 理 <Form method= GET action= cgi bin/greeting.cgi > <p> 挨 拶 : <input type= text name= message ></p> <p><input type= submit value= 送 信 ></p> </Form> 17
CGIの 1/2 GET Web Browser Web Server CGI プログ ラム 1. Web ServerがCGIプログラムを 起 動 2. CGIプログラムは 環 境 変 数 QUERY_STRING から, Web Browserの 送 ったFORMの 字 列 を 得 る 18
CGIの 2/2 POST Web Browser Web Server CGI プログ ラム 1. Web ServerがCGIプログラムを 起 動 2. Web Browserからのデータは,CGIプログラムの 標 準 へ 19
FORM(GET)からのデータ 取 得 1. 字 列 から 的 のデータを 取 り 出 す 2. sample.cgi?message=value&namae=atai&c ode=pattern <Form method= GET action= cgi bin/greeting.cgi > <p>d1<input type= text name= message ></p> <p>d2<input type= text name= NAMAE ></p> <p>d3<input type= text name= code ></p> <p><input type= submit value= 送 信 ></p> </Form>? 以 後,<name,value>が, &で 区 切 られた 字 列 ( 英 数 字 ) 20
パーセントエンコーディング 1. URIで 利 できない 字 を 使 うためのエン コード 2. 特 に 本 語! 3. URLエンコーディングとも 呼 ばれる 4. POSTメソッドで 字 列 を 送 るときの 符 号 化 (これもURLエンコードと 呼 ばれる) 21
ファイルの 利 open() Web Server CGI プログ ラム count.dat 例 ) カウンタ 掲 板 など close() 22
ファイルの 利 open() ( 危 険 ) CGI プログ ラム open() Web Server CGI プログ ラム count.dat Web Serverから CGIが 何 度 も 呼 ばれると 同 じファイルを 使 う 時 に 危 険 CGI プログ ラム close open() 23
cgiの 設 置 とアクセス 権 1/3 Web Serverから,CGIプログラムが 起 動 されると 通 常 は,Web Serverの 実 権 限 のまま 起 動 される Web Server CGI プログ ラム (hello.cgi) ~s1231987/public_html/cgi bin/hello.cgi Web Serverの 実 者 は apache, www, wwwrun, など,サーバ 設 定 に 依 存 する 24
cgiの 設 置 とアクセス 権 2/3 ~s1231987/public_html/cgi bin/hello.cgi 通 常 は, s1231987という 利 者 の 権 限 のみ そのままではCGIが 起 動 できない Web Serverの 実 者 と 権 限 が 異 なるから Web Server CGI プログ ラム (hello.cgi) ( 良 くない) 解 決 策 hello.cgiの 実 権 を 全 員 にする 他 のCGIからも 利 可 能 になる ( 良 くない) 解 決 策 Web Serverをroot( 管 理 者 )で 動 作 させる クラックされた 時, 暴 したとき めが 無 くなる SuExecという 仕 組 み( 詳 細 は 省 略 ) Web ServerからCGIを 実 するときに, ファイルの 所 有 者 (s1231987)の 権 限 で 実 させる 25
cgiの 設 置 とアクセス 権 3/3 ~s1231987/public_html/cgi bin/hello.cgi Web Server CGI プログ ラム (hello.cgi) hello.cgiのようなcgiプログラムから アクセス 可 能 な 範 囲 は, ファイルの 所 有 者 s1231987と 同 なので, /home/cs/s1231987/ 以 下 のファイルは 読 み 書 きできる cstmsはsuexec 設 定 済 み 例 ) カウンタ 掲 板 など 26
サンプルCGIの 説 明 1/2 1. getenv.c CGIの 環 境 変 数 を 表 2. helloworld.c Hello World と 表 3. helloworldj.c こんにちは と 表 4. date.c サーバ 上 の 時 刻 を 表 5. get method.c Form(GET)の 英 字 例 6. get methodj.c Form(GET)の 和 例 7. countup.c ファイル 利 (アクセスカウンタ) 8. simple bbs.c ファイル 利 掲 板 9. ( use mecab.c 形 態 素 解 析 器 の 利 ) 27
仕 様 書 の 提 出 締 切 2015 年 7 8 ( ) 午 前 9:00 この 演 習 中 にTAが 評 価 C 語 によりCGIを 作 成 する CGIの 完 成 締 切 2015 年 7 22 ( ) 午 前 9:00 この 演 習 中 に 学 相 互 で 評 価
課 題 C 語 による 独 のCGIプロ グラムを 作 成 1. cstms 上 にある 各 のウェブページ 1. ~s1331987/public_html/2015programming.html を 作 成 2. タイトル 3. CGIプログラムを 使 うためのリンク 4. CGIプログラムの 説 明 5. 夫 した 点 ( 章, 図 )の 説 明 6. Cプログラムへのリンク 7. 参 考 献, 参 考 にしたURI(URL)と 確 認 した 29
作 業 実 順 1. ssh, scpがパスワード 無 しで,cstmsへ えるよ うにする 2. Hello World 表 するcgiを 分 の public_html/cgi-bin/にscpして 動 作 することを 確 認 する 3. countup.c ファイル 利 (アクセスカウンタ)cgiを 分 のpublic_html/cgi-bin/にscpして 動 作 すること を 確 認 する 4. 何 を 作 るかのアイディア 仕 様 をA4 紙 に 書 く. 5. 書 き 上 がったらTAに せる. 6. TAのサインを 貰 ったら 作 成 開 始 30
CGIの 作 成 アイディア 例 1. simple search.c 全 検 索 システム 2. simple bot.c 無 脳 3. simple game.c CGIゲーム 31