/ / ruby ​​webrick and cgi - ruby, cgi, webrick

rubín webrick a cgi - rubín, cgi, webrick

Nedarí sa mi Webrick prinútiť pracovať so servletom HTTPServlet :: CGIHandler - Mám chybu EACCES:

[2012-12-06 01:38:02] ERROR CGIHandler: /tmp/cgi-bin:
/Users/7stud/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/webrick/httpservlet/cgi_runner.rb:46:in `exec": Permission denied - /tmp/cgi-bin (Errno::EACCES)
from /Users/7stud/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/webrick/httpservlet/cgi_runner.rb:46:in `<main>"
[2012-12-06 01:38:02] ERROR CGIHandler: /tmp/cgi-bin exit with 1
[2012-12-06 01:38:02] ERROR Premature end of script headers: /tmp/cgi-bin
localhost - - [06/Dec/2012:01:38:02 MST] "GET /cgi/my_prog.cgi HTTP/1.1" 500 326
- -> /cgi/my_prog.cgi

Tu sú povolenia, ktoré som nastavil:

~/ruby_programs$ cd /
/$ ls -al tmp
lrwxr-xr-x@ 1 root  wheel  11 Jul  3  2011 tmp -> private/tmp

/$ cd tmp
/tmp$ ls -al
total 0
drwxrwxrwt  8 root   wheel  272 Dec  6 01:08 .
drwxr-xr-x@ 6 root   wheel  204 Mar 27  2010 ..
drwxr-xr-x  3 7stud  wheel  102 Dec  6 01:25 cgi-bin

/tmp$ cd cgi-bin/
/tmp/cgi-bin$ ls -al my_prog.cgi
-rwxr-xr-x  1 7stud  wheel  123 Dec  6 01:09 my_prog.cgi

Môj serverový program (1.rb):

#!/usr/bin/env ruby
require "webrick"
include WEBrick

port = 12_000
dir = Dir::pwd

server = HTTPServer.new(
:Port           => port,
:DocumentRoot   => dir + "/html"
)

server.mount("/cgi", HTTPServlet::CGIHandler, "/tmp/cgi-bin")
puts "Listening on port: #{port}"

Signal.trap("SIGINT") { server.shutdown }
server.start

Spustenie programu servera:

~/ruby_programs$ ruby 1.rb
[2012-12-06 01:37:58] INFO  WEBrick 1.3.1
[2012-12-06 01:37:58] INFO  ruby 1.9.3 (2012-04-20) [x86_64-darwin10.8.0]
Listening on port: 12000
[2012-12-06 01:37:58] INFO  WEBrick::HTTPServer#start: pid=4260 port=12000

Túto adresu som zadal v prehliadači:

http://localhost:12000/cgi/my_prog.cgi

Toto sa zobrazilo v mojom prehliadači:

Interná chyba servera

Predčasný koniec hlavičiek skriptov: / tmp / cgi-bin WEBrick / 1.3.1 (Ruby / 1.9.3 / 2012-04-20) v localhost: 12000

Tu je môj skript cgi (/tmp/cgi-bin/my_prog.cgi):

#!/usr/bin/env ruby

require "cgi"
cgi = CGI.new
puts cgi.header
puts "<html><body>Hello Webrick</body></html>"

odpovede:

1 pre odpoveď č. 1

Jediným spôsobom, ako môžem získať WEBrick na vykonávanie súborov cgi v inom priečinku ako root, je použitie servletu HTTPServlet :: FileHandler:

port = 12_500
...

cgi_dir = File.expand_path("~/ruby_programs/cgi-bin")
server.mount("/cgi", HTTPServlet::FileHandler, cgi_dir)

Adresa URL použitá na vykonanie súboru .cgi umiestneného v doméne cgi_dir je:

http://localhost:12500/cgi/my_prog.cgi

Keď píšete:

server = HTTPServer.new(
:Port           => port,
:DocumentRoot   => "./html"  #Regular files served/.cgi files executed out of this dir
)

Webrick automaticky „pripojí“ HTTPServlet :: FileHandler na spracovanie požiadaviek do adresára: DocumentRoot, napr.

http://localhost:12500/my_html.htm

ktorý bude slúžiť súborom z adresára ./html (t. j. adresár s názvom html, ktorý sa nachádza pod adresárom, z ktorého je spustený váš program). HTTPServlet :: FileHandler bude tiež popraviť súbory v tomto adresári, ak majú príponu .cgi.

Ak explicitne použijete mount () na pridanie HTTPServlet :: FileHandler do iného adresára, napr.

cgi_dir = File.expand_path("~/ruby_programs/cgi-bin")
server.mount("/cgi", HTTPServlet::FileHandler, cgi_dir)

potom WEBrick bude tiež obsluhovať súbory z tohto adresára a spúšťať súbory v tomto adresári, ktoré majú príponu .cgi.

Nenašiel som spôsob, ako nakonfigurovať WEBrick tak, aby slúžil iba na ukladanie súborov z adresára: DocumentRoot a spúšťanie súborov .cgi iba v inom adresári.

Pozrite si Sprievodcu programom WEBrick „Gnome“ tu:

http://microjet.ath.cx/webrickguide/html/


1 pre odpoveď č. 2

V mojom prípade som mal podobné problémy kvôli nesprávnym povoleniam súborov a skutočne nesprávnym hlavičkám. Povolenia skriptu CGI by mali byť takéto:

~/ruby_projects/cgi_webrick/cgi
ls -l
-rwxr-xr-x 1 me me  112 Sep 20 20:29 test.cgi

Kód môjho servera vyzerá veľmi podobne (umiestnený v priečinku ~/ruby_projects/cgi_webrick/), ale s iným manipulátorom.

#!/usr/bin/env ruby

require "webrick"

server = WEBrick::HTTPServer.new :Port => 1234
server.mount "/", WEBrick::HTTPServlet::FileHandler , "./"
trap("INT") { server.stop }
server.start

Ak spustíte skript servera ruby my_server_script.cgi, bude slúžiť všetkým skriptom z koreňového alebo iného adresára. V mojom prípade mám prístup http://localhost:1234/cgi/test.cgi (skript umiestnený v cgi podpriečinok) a http://localhost:1234/test.cgi (umiestnené v koreňovom adresári, z ktorého je server spustený).

Môj testovací skript:

#!/usr/bin/ruby

require "cgi"

cgi = CGI.new
puts cgi.header
puts "<html><body>This is a test</body></html>"