たむらです。
>> ◎ Cygwin
>>
>> / および、sample.rhtmlは、問題なく動く。ただし、sample.cgiは、
>InternalError(500)で動かないみたい。それでもhttpd.rbが落ちたりは
>しなかった。どうも、shebang の #!/usr/bin/env ruby がCygwin環境で
>はおかしい
>>
>> #!/usr/local/bin/ruby.exe にしたら、cygwin1.dll がPATHに無いと言われた。
>
>ええと、これは子プロセス側で ENV をクリアしてから、
>CGI/1.1 相当のメタ変数だけをセットしているために、PATH
>が渡っていないからです。対策として考えられるのは、
>
> 1. cygwin1.dll を c:/windows とかに置く
> 2. httpd.rb の PATH を渡してやる
>
>で、2. が親切ぽいのですが、他人の CGI に触れる環境だと、
>意図しない穴を空けやすくなるような気もします。
>渡せるようなオプションも用意した方がいいんでしょうか。
そういうことですか。確かに wwwsrv は、環境変数のクリアをしてないので、
ENVを表示させると、PATHがずらーっと出てきますね。
(cygwin版)ruby.exe を、/usr/bin にインストールすると回避できるのですが
それも、う〜ん。
# 2. の『httpd.rb の PATH ...』良く意味が判りませんでした。
> wwwsrv は、CGI を動かすためのインタプリタを選べるように
> なってるんですね。
さっきテストしてみたら、
perl_cgi = WWWsrv::CGIdocument::new("./", false,'perl')
SERVER.mount(perl_cgi, '/', /\.cgi$/)
な設定でも、shbang 関係なしで動きますね。
# 拡張子.cgi で Ruby なスクリプトも動作しました。
> バイナリでもスクリプトでも同じ方法で起動できれば、と思っ
> ていたんですが、Windows では難しそうなので、さきほど、
>
> HTTPServer.new(
> :CGIInterpreter => "/ruby17/bin/ruby",
> ...
> )
>
> のようにして、インタプリタを指定できるようにしてみました。
> (nil の場合は、従来通りに exec します。)
> Windows ではまだ動かしていないので、もしよければ試しても
> らえないでしょうか。
以下のスクリプトで試してみました。一応 /usr/bin/ruby を
シンボリックリンクで作って試したりしてみました。
#!/usr/local/bin/ruby
require 'webrick'
dir = File::dirname(File::expand_path(__FILE__))
s=WEBrick::HTTPServer.new(
:BindAddress => "0.0.0.0",
:Port => 8089,
:Logger => WEBrick::Log::new($stderr, WEBrick::Log::DEBUG),
:DocumentRoot => dir,
# :CGIInterpreter => '/usr/bin/perl' # 1
:CGIInterpreter => '/usr/bin/ruby' # 2
# :CGIInterpreter => '/usr/local/bin/ruby' # 3
)
trap("INT"){ s.shutdown }
s.start
結果的には、1 の perl(笑 だけ動作します。pnamazu.cgi も正常に動きました。
セキュリティとのトレードオフになりますが、Cygwin に関しては、子プロセスの
クリアをしないという引数を作っていただくか、 RUBY_PLATFORM で判断
して、'/usr/bin' のみ PATH 設定してやるというのが、一番現実的な気
がしますです。
# あるいは、 cygwin1.dll の場所だけ パラメータで渡してもらって、
# PATH にセットしてやるか。
tDiary はじめました。 http://tamura.tdiary.net
たむら mailto:sgs02516@nifty.com