1 :
nobodyさん :
03/03/20 01:27 ID:zBrN4BPB Perl vs. PHP vs. Rubyと言われているこの時代に shスクリプトでcgiを書いている奴っていますか。 周りからは生きた化石と言われながら、頑固一徹 shスクリプトのcgiの可能性にかけている。 そんなcgi職人、集まれ!
Cでcgiを書いてますが何か? ↓C++で書いてるヤシ
低パワーマシンで perl や python では重すぎる CGI でシェルスクリプト使ったりします。
5 :
nobodyさん :03/03/20 08:00 ID:0FfyPGzB
#!/bin/sh echo "Coutent-type:text/html;charse:Shift_JIS\r\n\r\n逝ってよし"
かけないこともないが perlで重くてシェルスクリプトで軽いってことは そんなにないだろう? もしそうなのならマシンを見直す必要があると思うが・・・ WinのバッチファイルでCGI組んでるやつの方が まだネタになるぞ
> WinのバッチファイルでCGI すごい穴になりそうだな
8 :
nobodyさん :03/03/21 00:42 ID:dpOkqofd
shスリプトでここまでできたという事例が聞ければうれしっす。 /bin/sh
>>7 つぅか標準入力を扱えない時点でCGI失格だと思われ。
C++ with MFC で家庭内LAN用のCGI作ろうとしてますが、何か? # CStringマンセー
機会があればschemeで作ろうとしてるんですけど割と神ですか?
どこかで404とかのドキュメントを ブラウザの環境変数であれこれする shスクリプト見たような気がする
shbbs.cgi (1/2) #! /bin/sh if [ $REQUEST_METHOD = "POST" ] then cp log.txt dummy.txt printf "`cat -| awk -f filt.awk`" | sed -f filt.sed >> dummy.txt printf "<br>\n" >> dummy.txt tail -30 dummy.txt > log.txt fi cat <<END_OF_HEADER Content-type: text/html; charset=EUC-JP <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html lang="ja"> <head> <meta http-equiv="Content-Script-Type" content="text/javascript"> <meta http-equiv="content-type" content="text/html; charset=EUC-JP"> <title>/bin/sh BBS</title> </head> <body onLoad="LoadCookie()"> <script type="text/javascript"><!-- function SaveCookie(val){ document.cookie = "handle_name="+escape(val)+"; path=/;"; }
sshbbs.cgi (2/3) function LoadCookie(){ var cookies = document.cookie.split(";"), value = ""; for(var i = 0; i < cookies.length; i++){ var piece = cookies[i].split("="); if (piece[0].replace(" ","") == "handle_name"){ if (piece[1] != null){ document.forms[0].name.value = unescape(piece[1]); } break; } } } --></script> <h1 align="center">/bin/sh BBS</h1> <hr> <dl> <dd> END_OF_HEADER cat log.txt
snbbs.cgi (3/3) cat <<END_OF_FOOTER </dd> </dl> <hr> <a name="form">post form</a> <form method="POST" action="shbbs.cgi#form" onSubmit="SaveCookie(this.name.value)"> name: <input name="name" size="19"> message: <input name="message" size="80"> <input type="submit" value="Write"> </form> <div align="right"><a href="shbbs.cgi#form">Reload</a></div> <hr> <div align="right">/bin/sh BBS ver 1.0</div> </body> </html> END_OF_FOOTER
filt.awk(1/3) BEGIN { FS="=" RS="&" } { key = "0123456789ABCDEFabcdef" str = "" i = 1 while(i <= length($2)){ d = substr($2, i, 1) i++ if (d == "%"){ oct = 0 for(j = 0; j < 2; j++){ oct *= 16 d = substr($2, i, 1) i++ for(k = 1; k < length(key); k++){ if (d == substr(key, k, 1)){ if (k > 16) k -= 6 oct += k-1 break } } }
filt.awk (2/3) # if (oct > 127) oct = 32 if (oct < 32) oct = 32 col = 64 dec = "" while(col > 0){ d = int(oct/col) dec = (dec d) oct -= d*col col = int(col/8) } str = (str "\\" dec) } else { if (d == "+") d = " " str = (str d) } } $2 = str }
filt.awk (3/3) $1 == "name" { name = $2 } $1 == "message" { message = $2 } END { RS = "\n" "date +'%y/%m/%d %T'" | getline time print ("[" time ": " name "] " message) }
filt.sed (1/1) s/&/\&/g s/</\</g s/>/\>/g s/"/\"/g
>>13-19 で、一行BBSできます。
log.txt,dummy.txtを作っといてね。
# 動作無保証。
>>19 s/&/\&/g
s/</\</g
s/>/\>/g
s/"/\"/g
うう。
うえーん!ソースコピペ荒らし反対!!!
24 :
nobodyさん :03/03/22 12:41 ID:Ve1PHIbC
>>23 さん
どんまい。shだけでも結構なことができるんですね。
おかわり!
>>24 私の技量ではあれが限界。
awkなんて初めて使ったよ。
26 :
nobodyさん :03/03/23 14:34 ID:emAJ6ArI
>>26 作ろか?標準入力から入ってきたデータURLデコードするプログラム。
って言うかawkでも使えば?じゃあPerl使った方が早いなぁ・・・。
って言うかPerlの関数呼び出しとshのプロセス起動させまくり、どっちが軽いの?
28 :
nobodyさん :03/03/23 15:33 ID:emAJ6ArI
>>27 様
おねげーしますだ。m(_ _)m
できればawkのものが勉強のためにはうれしかったりします。
>>28 27じゃないけど、単に標準入力から読んでデコードして標準出力に書き出すだけならこれでいいかな。
きちんとテストしていないけど。一度全てバッファに取り込んだ方がいいかな?
#include <stdio.h>
#include <stdlib.h>
int main()
{
char s[3]={0};
int c;
while((c=getchar())!=EOF){
switch(c){
case '+':
putchar(' ');
break;
case '%':
s[0]=((c=getchar())==EOF)?'\0':c;
s[1]=((c=getchar())==EOF)?'\0':c;
putchar(strtol(s,NULL,16));
break;
default:
putchar(c);
break;
}
}
return 0;
}
30 :
nobodyさん :03/03/23 21:53 ID:emAJ6ArI
>>29 様
ありがとうございます。
これはccでコンパイルした後、どうshスクリプトに組み込めばよいのですか。
初学者なものでお手数をとらせてもうしわけございません。
sh スクリプトで URL デコード。 URL エンコードされてない無関係な文字列が入ってると破綻するけど。 % cat urldec.sh #!/bin/sh ( echo ibase=16; echo obase=8; echo "$@" | tr a-z% A-Z\\n ) |\ bc |\ while read a; do echo -e \\0$a done |\ tr -d \\n % sh urldec.sh %A4%DB%A4%B2
32 :
nobodyさん :03/03/23 23:12 ID:826klXke
>>11 おいらLISP(clisp)でつくってるよ〜
#! /usr/bin/perl
open (MYLISP,">mylisp.lisp");
print MYLISP "S式";
close(MYLISP);
system("clisp mylisp.lisp");
こんなんだけど・・・
33 :
nobodyさん :03/03/23 23:15 ID:e2yFDnGv
>>32 あんた、そっち公開しても仕方ないっしょ。
>>35 ああ、スーパサーバ使えば後は標準入出力のプログラムになるからなぁ。
>>35 <H1>ただいまメンテ中</H1>
って吐くだけの同じ奴を使ってた事がある。
apache止めてる間だけとか。
mod_brainfuck で…。(誰か使ってる人いない?)
なつかしーな。1994年ごろは、カウンタっていったら、shとperlが半々だったきがする
40 :
nobodyさん :03/04/06 00:59 ID:/7G2cvSN
>>39 shスクリプトが生き残れなかったのはなんでだろう?
外部コマンドを大量に起動するためにオーバヘッドが非常に大きく遅い。 shから呼ばれる外部コマンドのパスや引数や実装がOSによって大きく異なる。 あまつさえ/bin/sh自身がOSによって互換性がない。
>>41 うむ。その前提で限界に挑戦するのがおもしろいのではないのか?
毎回自分自身がどのような環境に置かれた sh なのか調査した上で動き出すようにすればよい。
configureかよ!
45 :
山崎渉 :03/04/17 12:09 ID:???
(^^)
46 :
山崎渉 :03/04/20 06:23 ID:???
∧_∧ ( ^^ )< ぬるぽ(^^)
47 :
nobodyさん :03/05/01 00:19 ID:nSLOiiM0
echo "AGE"
48 :
bloom :03/05/01 00:29 ID:YcBKOzoM
multipart/form-data ならデコードしなくて済むのでわ, と言ってみるテスト
50 :
山崎渉 :03/05/22 02:06 ID:???
━―━―━―━―━―━―━―━―━[JR山崎駅(^^)]━―━―━―━―━―━―━―━―━―
51 :
山崎渉 :03/05/28 17:18 ID:???
∧_∧ ピュ.ー ( ^^ ) <これからも僕を応援して下さいね(^^)。 =〔~∪ ̄ ̄〕 = ◎――◎ 山崎渉
>>41 > 外部コマンドを大量に起動するためにオーバヘッドが非常に大きく遅い。
> shから呼ばれる外部コマンドのパスや引数や実装がOSによって大きく異なる。
> あまつさえ/bin/sh自身がOSによって互換性がない。
上のほうでシェルスクリプトがperlより軽いとか言ってるのはウソなんですね。
ほんとうに sh しか使わんのならかなり軽いよ。 ただ、ある程度以上の規模になると外部コマンドを fork せずに スクリプトを書くことができない。だから総体として重くなる。 ある程度以上の規模のスクリプトなら、 いったん中間言語にコンパイルしてから実行する perl にはかなわんね。
>いったん中間言語にコンパイルしてから実行する perl にはかなわんね。 テキスト−>解析−>実行 テキスト−>解析−>中間コード生成−>解析−>実行 Perlの方が遅くないか?JSPの初回起動みたいなもんだろ。 ループとかだと若干有利か。
@system("echo <HTML>")
56 :
山崎 渉 :03/07/15 11:16 ID:???
__∧_∧_ |( ^^ )| <寝るぽ(^^) |\⌒⌒⌒\ \ |⌒⌒⌒~| 山崎渉 ~ ̄ ̄ ̄ ̄
57 :
山崎 渉 :03/08/02 02:35 ID:???
∧_∧ ( ^^ )< ぬるぽ(^^)
∧_∧ ∧_∧ ピュ.ー ( ・3・) ( ^^ ) <これからも僕たちを応援して下さいね(^^)。 =〔~∪ ̄ ̄ ̄∪ ̄ ̄〕 = ◎――――――◎ 山崎渉&ぼるじょあ
59 :
山崎 渉 :03/08/15 23:04 ID:???
(⌒V⌒) │ ^ ^ │<これからも僕を応援して下さいね(^^)。 ⊂| |つ (_)(_) 山崎パン
保守
rrr
1994年ごろ、 カウンタつっても、Perlかshでつくったものしかなかったよ・・・なつかしや
うわ、11ヶ月ぶりのレスじゃねーかw
64 :
nobodyさん :2005/11/29(火) 20:35:42 ID:6biAl2f4
apacheでshでCGI動かす設定ってどうやるんですか? perlとC(バイナリ)では正常に動くんですけど・・・ shだと500 internal server errorになります。 ちなみにシェルはcsh使ってます
CGIなんだから、一行目にシェバングパスを書かないとだめだぞと。
>>64 hello.cgi
-----------------
#!/bin/sh
echo "Content-type: text/html\n\n";
echo "Hello";
ほす
68 :
nobodyさん :2008/10/15(水) 20:02:22 ID:CwbSjCAQ
ぺす
昔アセンブラでCGI作って動かしてたな(´・ω・`)
70 :
nobodyさん :2008/11/14(金) 13:01:21 ID:elYW8Na3
>>64 .shで動かしたいならスクリプトがあるディレクトリに.htaccessを作り、
AddType application/x-httpd-cgi .sh
と書けばよい
シェルスクリプトでてきとうにURLでこーど #!/bin/bash #環境変数[QUERY_STRING]を[&]を空白に変換しパース _QRYVAL=`echo "$QUERY_STRING" | tr '&' '\t'` #引数解析 for v in $_QRYVAL do #[=]を空白に変換し配列化 v=(`echo "$v" | tr '=' '\t'`) #formの[name]に[value]を格納(URLデコード) eval "${v[0]}"="`echo ${v[1]} | tr % = | nkf -emQZ1`" done
t
echo "hoshu"