์˜์–ดํ”„๋ž‘์Šค์–ด์ŠคํŽ˜์ธ์–ด

Ad


์˜จ์›์Šค ํŒŒ๋น„์ฝ˜

haserl - ํด๋ผ์šฐ๋“œ ์˜จ๋ผ์ธ

Ubuntu Online, Fedora Online, Windows ์˜จ๋ผ์ธ ์—๋ฎฌ๋ ˆ์ดํ„ฐ ๋˜๋Š” MAC OS ์˜จ๋ผ์ธ ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ํ†ตํ•ด OnWorks ๋ฌด๋ฃŒ ํ˜ธ์ŠคํŒ… ๊ณต๊ธ‰์ž์—์„œ haserl ์‹คํ–‰

์ด๊ฒƒ์€ Ubuntu Online, Fedora Online, Windows ์˜จ๋ผ์ธ ์—๋ฎฌ๋ ˆ์ดํ„ฐ ๋˜๋Š” MAC OS ์˜จ๋ผ์ธ ์—๋ฎฌ๋ ˆ์ดํ„ฐ์™€ ๊ฐ™์€ ์—ฌ๋Ÿฌ ๋ฌด๋ฃŒ ์˜จ๋ผ์ธ ์›Œํฌ์Šคํ…Œ์ด์…˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ OnWorks ๋ฌด๋ฃŒ ํ˜ธ์ŠคํŒ… ๊ณต๊ธ‰์ž์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ช…๋ น haserl์ž…๋‹ˆ๋‹ค.

ํ”„๋กœ๊ทธ๋žจ:

์ด๋ฆ„


haserl - ์ž„๋ฒ ๋””๋“œ ํ™˜๊ฒฝ์„ ์œ„ํ•œ cgi ์Šคํฌ๋ฆฝํŒ… ํ”„๋กœ๊ทธ๋žจ

๊ฐœ์š”


#!/usr/bin/haserl [--์‰˜=๊ฒฝ๋กœ ์‚ฌ์–‘] [--์—…๋กœ๋“œ-๋””๋ ‰ํ† ๋ฆฌ=๋””๋ ‰ํ† ๋ฆฌ] [--์—…๋กœ๋“œ ํ•ธ๋“ค๋Ÿฌ=๋งค๋‹ˆ์ €]
[--์—…๋กœ๋“œ ์ œํ•œ=์ œํ•œ] [--๋ชจ๋“ ๊ฒƒ์„ ๋ฐ›์•„ ๋“ค์ธ๋‹ค] [--์ˆ˜๋ฝ ์—†์Œ] [--์กฐ์šฉํ•œ] [--๋””๋ฒ„๊ทธ]

[ ํ…์ŠคํŠธ ] [ <% ์‰˜ ์Šคํฌ๋ฆฝํŠธ %> ] [ ํ…์ŠคํŠธ ] ...

๊ธฐ์ˆ 


Haserl์€ "PHP" ์Šคํƒ€์ผ์˜ cgi ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ—ˆ์šฉํ•˜๋Š” ์ž‘์€ cgi ๋ž˜ํผ์ด์ง€๋งŒ UNIX๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
bash์™€ ๊ฐ™์€ ์…ธ ๋˜๋Š” Lua๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋งค์šฐ ์ž‘๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ž„๋ฒ ๋””๋“œ ํ™˜๊ฒฝ ๋˜๋Š” PHP์™€ ๊ฐ™์€ ๊ฒƒ์ด ๋„ˆ๋ฌด ํฐ ๊ฒฝ์šฐ.

์„ธ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์„ ์ž‘์€ cgi ์—”์ง„์— ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๋‹ค.

POST ๋ฐ GET ์š”์ฒญ์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜์—ฌ ์–‘์‹ ์š”์†Œ๋ฅผ ์ด๋ฆ„=๊ฐ’ ์Œ์œผ๋กœ
์‚ฌ์šฉํ•  CGI ์Šคํฌ๋ฆฝํŠธ์˜ ํ™˜๊ฒฝ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹ค์†Œ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์šด๊ธฐ ์‹ธ๊ฐœ.

์‰˜์„ ์—ด๊ณ  ๋ชจ๋“  ํ…์ŠคํŠธ๋ฅผ ์ธ์‡„ ๊ฐ€๋Šฅํ•œ ๋ช…๋ น๋ฌธ์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ํ…์ŠคํŠธ
<% ... %> ๋‚ด ๊ตฌ์„ฑ์€ ๊ทธ๋Œ€๋กœ ์‰˜์— ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹ค์†Œ
๊ธ€์“ฐ๊ธฐ์ฒ˜๋Ÿผ PHP ์Šคํฌ๋ฆฝํŠธ.

์„ ํƒ์ ์œผ๋กœ ์„ค์น˜ํ•˜์—ฌ ์Šคํฌ๋ฆฝํŠธ ์†Œ์œ ์ž์—๊ฒŒ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ผ๋ถ€ ๋ณด์•ˆ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜์—‘ or cgiwrapper.

์˜ต์…˜ ๊ฐœ์š”


๋‹ค์Œ์€ ๋ช…๋ น์ค„ ์˜ต์…˜์— ๋Œ€ํ•œ ์š”์•ฝ์ž…๋‹ˆ๋‹ค. ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค ์˜ต์…˜ ์•„๋ž˜ ์„น์…˜
์™„์ „ํ•œ ์„ค๋ช…์„ ์œ„ํ•œ ๊ธด ์˜ต์…˜ ์ด๋ฆ„.

-a --์ˆ˜๋ฝ ๋ชจ๋‘
-n --์ˆ˜๋ฝ ์—†์Œ
-d --๋””๋ฒ„๊ทธ
-s, --์‰˜
-S, --์นจ๋ฌต
-U, --์—…๋กœ๋“œ-๋””๋ ‰ํ„ฐ๋ฆฌ
-u, --์—…๋กœ๋“œ ์ œํ•œ
-H, --์—…๋กœ๋“œ ํ•ธ๋“ค๋Ÿฌ

์˜ต์…˜


--๋ชจ๋“ ๊ฒƒ์„ ๋ฐ›์•„ ๋“ค์ธ๋‹ค
ํ”„๋กœ๊ทธ๋žจ์€ ์ผ๋ฐ˜์ ์œผ๋กœ REQUEST_METHOD๊ฐ€ POST์ด๊ณ 
REQUEST_METHOD๊ฐ€ GET์ธ ๊ฒฝ์šฐ์—๋งŒ URL ๋ฐ์ดํ„ฐ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜๋ฝํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ต์…˜
REQUEST_METHOD์— ๊ด€๊ณ„์—†์ด POST ๋ฐ URL ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
์ด ์˜ต์…˜์ด ์„ค์ •๋˜๋ฉด REQUEST_METHOD๊ฐ€ ์šฐ์„ ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: ๋ฉ”์†Œ๋“œ๊ฐ€
๋Š” POST์ด๊ณ  FORM_variables๋Š” COOKIE ๋ฐ์ดํ„ฐ, GET ๋ฐ์ดํ„ฐ ๋ฐ POST ๋ฐ์ดํ„ฐ์—์„œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
๊ทธ ์ฃผ๋ฌธ. ๋ฉ”์†Œ๋“œ๊ฐ€ GET์ธ ๊ฒฝ์šฐ FORM_variables๋Š” COOKIE ๋ฐ์ดํ„ฐ์—์„œ ๊ฐ€์ ธ์˜ค๊ณ  POST
๋ฐ์ดํ„ฐ ๋ฐ GET ๋ฐ์ดํ„ฐ.) ๊ธฐ๋ณธ๊ฐ’์€ ๋ชจ๋“  ์ž…๋ ฅ ๋ฐฉ๋ฒ•์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
COOKIE ๋ฐ์ดํ„ฐ ๋ฐ REQUEST_METHOD.

--์ˆ˜๋ฝ ์—†์Œ
์ฃผ์–ด์ง„ ๊ฒฝ์šฐ haserl์€ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์ „์— ํ‘œ์ค€ ์ž…๋ ฅ์„ http ์ฝ˜ํ…์ธ ๋กœ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋Œ€๋ณธ. ์ด๊ฒƒ์€ ๋‹ค๋ฅธ haserl ์Šคํฌ๋ฆฝํŠธ์—์„œ haserl ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

-๋””๋ฒ„๊ทธ
์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋Œ€์‹  ์‹คํ–‰ํ•  ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ์—
ํ™˜๊ฒฝ ๋ณ€์ˆ˜ 'REQUEST_METHOD'๊ฐ€ ์„ค์ •๋˜๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€
์ผ๋ฐ˜/ํ…์ŠคํŠธ ์ฝ˜ํ…์ธ  ์œ ํ˜•. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์…ธ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๊ทธ๋Œ€๋กœ ์ธ์‡„๋ฉ๋‹ˆ๋‹ค.

--์‰˜=๊ฒฝ๋กœ ์‚ฌ์–‘
์‚ฌ์šฉํ•  ๋Œ€์ฒด bash์™€ ์œ ์‚ฌํ•œ ์…ธ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ "/ ๋นˆ / SH"

์…ธ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํฌํ•จํ•˜๋ ค๋ฉด --shell=์„ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค./ ๋นˆ / SH ์ฒด์žฌ. ๋Œ€์‹  ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.
--shell "์—์„œ์™€ ๊ฐ™์ด "="๊ฐ€ ์—†๋Š” ๋Œ€์ฒด ํ˜•์‹/ bin / bash --norc". ๋ฐ˜๋“œ์‹œ
ํŠน์ˆ˜ ๋ฌธ์ž๋ฅผ ๋ณดํ˜ธํ•˜๋ ค๋ฉด ์˜ต์…˜ ๋ฌธ์ž์—ด์„ ์ธ์šฉํ•˜์‹ญ์‹œ์˜ค.

Lua ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ปดํŒŒ์ผ๋œ ๊ฒฝ์šฐ "lua" ๋ฌธ์ž์—ด์€ ํ†ตํ•ฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
๋ฃจ์•„ vm. ์ด ๋ฌธ์ž์—ด์€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ: --์‰˜=๋ฃจ์•„

๋Œ€์•ˆ์€ "luac"์ž…๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด haserl ๋ฐ lua ํŒŒ์„œ๊ฐ€ ๋น„ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.
์Šคํฌ๋ฆฝํŠธ๋Š” ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผ๋œ lua ์ฒญํฌ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. ๋ณด๋‹ค ๋ฃจ์•… ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์•„๋ž˜
์ •๋ณด.

--์กฐ์šฉํ•œ
Haserl์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์˜ค๋ฅ˜ ์กฐ๊ฑด์— ๋Œ€ํ•œ ์ •๋ณด ๋ฉ”์‹œ์ง€๋ฅผ ์ธ์‡„ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ
์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์–ต์ œํ•˜์—ฌ haserl ์‚ฌ์šฉ์ด ๊ด‘๊ณ ๋˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

--์—…๋กœ๋“œ-๋””๋ ‰ํ† ๋ฆฌ=๋””๋ ‰ํ† ๋ฆฌ
๊ธฐ๋ณธ๊ฐ’์€ "/ TMP". ์—…๋กœ๋“œ๋œ ๋ชจ๋“  ํŒŒ์ผ์€ ์ž„์‹œ ํŒŒ์ผ ์ด๋ฆ„์œผ๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
์˜ˆ๋ฐฐ ๊ทœ์น™์„œ HASERL_xxx_๊ฒฝ๋กœ ์ž„์‹œ ํŒŒ์ผ์˜ ์ด๋ฆ„์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. FORM_xxx_์ด๋ฆ„
ํด๋ผ์ด์–ธํŠธ์—์„œ ์ง€์ •ํ•œ ํŒŒ์ผ์˜ ์›๋ž˜ ์ด๋ฆ„์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

--์—…๋กœ๋“œ ํ•ธ๋“ค๋Ÿฌ=๊ฒฝ๋กœ ์‚ฌ์–‘
์ง€์ •ํ•˜๋ฉด ํŒŒ์ผ ์—…๋กœ๋“œ๊ฐ€ ๊ธฐ๋ก๋˜์ง€ ์•Š๊ณ  ์ด ํ•ธ๋“ค๋Ÿฌ์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
์ž„์‹œ ํŒŒ์ผ. ์ „์ฒด ๊ฒฝ๋กœ ์‚ฌ์–‘์„ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(PATH๋Š” ๊ฒ€์ƒ‰๋˜์ง€ ์•Š์Œ).
์—…๋กœ๋“œ ํ•ธ๋“ค๋Ÿฌ์—๋Š” ํ•˜๋‚˜์˜ ๋ช…๋ น์ค„ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.
์—…๋กœ๋“œ ํŒŒ์ผ์ด ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ํ•ธ๋“ค๋Ÿฌ๋Š” 3
ํ™˜๊ฒฝ ๋ณ€์ˆ˜: ์ปจํ…์ธ  ํƒ€์ž…, ํŒŒ์ผ ์ด๋ฆ„๋ฐ ์ด๋ฆ„. ์ด๋“ค์€ MIME์„ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.
์ฝ˜ํ…์ธ ์— ๋Œ€ํ•œ ์ฝ˜ํ…์ธ  ์ฒ˜๋ฆฌ ํ—ค๋”์ž…๋‹ˆ๋‹ค. Haserl์€ ๊ฐ๊ฐ์— ๋Œ€ํ•ด ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํฌํฌํ•ฉ๋‹ˆ๋‹ค.
ํŒŒ์ผ์ด ์—…๋กœ๋“œ๋˜๊ณ  ์—…๋กœ๋“œ ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ์ง€์ •๋œ FIFO๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋ฉด Haserl์€ ์ฒ˜๋ฆฌ๊ธฐ๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ์ „๋ฌธ๊ฐ€๋ฅผ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋กœ ์ž‘์„ฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

--์—…๋กœ๋“œ ์ œํ•œ=์ œํ•œ
MIME ์ธ์ฝ”๋”ฉ ํŒŒ์ผ์„ ์ตœ๋Œ€ ํ—ˆ์šฉ ์ œํ•œ KB ์—…๋กœ๋“œ ์˜ˆ์ •. ๊ธฐ๋ณธ๊ฐ’์€ 0KB (์•„๋‹ˆ์˜ค
์—…๋กœ๋“œ ํ—ˆ์šฉ). MIME ์ธ์ฝ”๋”ฉ์€ ๋ฐ์ดํ„ฐ ํฌ๊ธฐ์— 33%๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ์š” OF ์šด์˜


์ผ๋ฐ˜์ ์œผ๋กœ ์›น ์„œ๋ฒ„๋Š” ์—ฌ๋Ÿฌ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•œ ๋‹ค์Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํฌํฌ or
CGI ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•. ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ํ•˜์…€ ํ†ต์—ญ์‚ฌ,
๋‹ค์Œ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

If ํ•˜์…€ suid ๋ฃจํŠธ๊ฐ€ ์„ค์น˜๋˜๋ฉด uid/gid๊ฐ€ ์Šคํฌ๋ฆฝํŠธ ์†Œ์œ ์ž๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

ํ™˜๊ฒฝ์ด ์Šค์บ”๋ฉ๋‹ˆ๋‹ค. HTTP_์ฟ ํ‚ค, ์›น์—์„œ ์„ค์ •ํ–ˆ์„ ์ˆ˜ ์žˆ์Œ
์„ฌ๊ธฐ๋Š” ์‚ฌ๋žŒ. ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ๊ตฌ๋ฌธ ๋ถ„์„๋œ ๋‚ด์šฉ์ด ๋กœ์ปฌ ํ™˜๊ฒฝ์— ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค.

ํ™˜๊ฒฝ์ด ์Šค์บ”๋ฉ๋‹ˆ๋‹ค. ์š”์ฒญํ•˜๊ธฐ, ์›น ์„œ๋ฒ„์— ์˜ํ•ด ์„ค์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์š”์ฒญ ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ ํ‘œ์ค€ ์ž…๋ ฅ์„ ์ฝ๊ณ  ๊ตฌ๋ฌธ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์‹ฑ๋œ
์ฝ˜ํ…์ธ ๋Š” ๋กœ์ปฌ ํ™˜๊ฒฝ์— ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค.

์Šคํฌ๋ฆฝํŠธ๋Š” ํ† ํฐํ™”๋˜์–ด ๊ตฌ๋ฌธ ๋ถ„์„๋ฉ๋‹ˆ๋‹ค. ํ•˜์…€ ์›์‹œ ํ…์ŠคํŠธ์˜ ์ฝ”๋“œ ๋ธ”๋ก. ์›์‹œ ํ…์ŠคํŠธ๋Š”
"echo" ๋ฌธ์œผ๋กœ ๋ณ€ํ™˜๋œ ๋‹ค์Œ ๋ชจ๋“  ํ† ํฐ์ด ํ•˜์œ„ ์…ธ๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.

ํ•˜์…€ ํฌํฌ ๋ฐ ํ•˜์œ„ ์‰˜(์ผ๋ฐ˜์ ์œผ๋กœ / ๋นˆ / SH)์ด ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ํ† ํฐ์€ ํ›„ํ–‰๊ณผ ํ•จ๊ป˜ ํ•˜์œ„ ์…ธ์˜ STDIN์œผ๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ์ถœ๊ตฌ ๋ช…๋ น.

ํ•˜์œ„ ์…ธ์ด ์ข…๋ฃŒ๋˜๋ฉด ํ•˜์…€ ํ†ต์—ญ์‚ฌ๋Š” ์ตœ์ข… ์ •๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ 
๊ทธ๋Ÿฐ ๋‹ค์Œ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

๊ณ ๊ฐ ์ธก๋ฉด ์ž…๋ ฅ


XNUMXD๋ดํƒˆ์˜ ํ•˜์…€ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋Š” HTTP_COOKIE ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ์ „์†ก๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋””์ฝ”๋”ฉํ•˜๊ณ 
ํด๋ผ์ด์–ธํŠธ์—์„œ GET ๋˜๋Š” POST ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ด๋ฅผ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์ €์žฅํ•˜์—ฌ
haserl์— ์˜ํ•ด ์•ก์„ธ์Šค๋ฉ๋‹ˆ๋‹ค. ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์€ ์†Œ์Šค์— ์ฃผ์–ด์ง„ ์ด๋ฆ„์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.
์ ‘๋‘์‚ฌ( FORM_)๊ฐ€ ๋ถ™์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํด๋ผ์ด์–ธํŠธ๊ฐ€ "foo=bar"๋ฅผ ๋ณด๋‚ธ๋‹ค๋ฉด,
ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋Š” FORM_foo=๋ฐ”.

HTTP_COOKIE ๋ฉ”์„œ๋“œ์˜ ๊ฒฝ์šฐ ๋ณ€์ˆ˜๋„ ์ ‘๋‘์‚ฌ( COOKIE_) ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด HTTP_COOKIE์— "foo=bar"๊ฐ€ ํฌํ•จ๋œ ๊ฒฝ์šฐ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋Š”
COOKIE_foo=๋ฐ”.

GET ๋ฉ”์†Œ๋“œ์˜ ๊ฒฝ์šฐ %xx ํ˜•์‹์œผ๋กœ ์ „์†ก๋œ ๋ฐ์ดํ„ฐ๋Š” ํ•ด๋‹น ๋ฌธ์ž๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค.
๋‚˜ํƒ€๋‚ด๊ณ  ๋ณ€์ˆ˜๋„ ์ ‘๋‘์‚ฌ( ๋ฐ”๋กœ_) ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด,
QUERY_STRING์—๋Š” "foo=bar"๊ฐ€ ํฌํ•จ๋˜๋ฉฐ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. GET_foo=๋ฐ”.

POST ๋ฉ”์„œ๋“œ์˜ ๊ฒฝ์šฐ ๋ณ€์ˆ˜๋„ ์ ‘๋‘์‚ฌ( POST_) ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์„ ์œ„ํ•œ
์˜ˆ๋ฅผ ๋“ค์–ด ํฌ์ŠคํŠธ ์ŠคํŠธ๋ฆผ์— "foo=bar"๊ฐ€ ํฌํ•จ๋œ ๊ฒฝ์šฐ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋Š” POST_foo=๋ฐ”.

๋˜ํ•œ POST ๋ฐฉ์‹์˜ ๊ฒฝ์šฐ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋Š” ๊ฒฝ์šฐ ๋ฉ€ํ‹ฐ ํŒŒํŠธ / ์–‘์‹ ๋ฐ์ดํ„ฐ ์ธ์ฝ”๋”ฉ,
๋ฐ์ดํ„ฐ๊ฐ€ ์ž๋™์œผ๋กœ ๋””์ฝ”๋”ฉ๋ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์›น์—์„œ ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
์‚ฌ์šฉํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ .

์ฃผ์˜์‚ฌํ•ญ ํŒŒ์ผ์ด ์›น ์„œ๋ฒ„์— ์—…๋กœ๋“œ๋˜๋ฉด ๋‹ค์Œ ์œ„์น˜์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ์—…๋กœ๋“œ ๋””๋ ‰ํ„ฐ๋ฆฌ
๋””๋ ‰ํ† ๋ฆฌ. FORM_๋ณ€์ˆ˜_์ด๋ฆ„= ์—…๋กœ๋“œ๋œ ํŒŒ์ผ์˜ ์ด๋ฆ„์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค(์˜ˆ:
ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.) HASERL_variable_path= ํŒŒ์ผ์˜ ์ด๋ฆ„์„ ํฌํ•จ
์—…๋กœ๋“œ ๋””๋ ‰ํ„ฐ๋ฆฌ ์—…๋กœ๋“œ๋œ ์ฝ˜ํ…์ธ ๋ฅผ ๋ณด์œ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์•…์˜์ ์ธ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด
์ฑ„์šฐ๋‹ค ์—…๋กœ๋“œ ๋””๋ ‰ํ„ฐ๋ฆฌ ์›น ์„œ๋ฒ„์—์„œ ํŒŒ์ผ ์—…๋กœ๋“œ๋Š” ๋‹ค์Œ ๊ฒฝ์šฐ์—๋งŒ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.
--์—…๋กœ๋“œ ์ œํ•œ ์˜ต์…˜์€ ์—…๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋Š” ํŒŒ์ผ ํฌ๊ธฐ๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ•˜์…€
์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์ž„์‹œ ํŒŒ์ผ์„ ์ž๋™์œผ๋กœ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ์œ ์ง€ํ•˜๋ ค๋ฉด
ํŒŒ์ผ์„ ์ด๋™ํ•˜๊ฑฐ๋‚˜ ์Šคํฌ๋ฆฝํŠธ์˜ ์–ด๋”˜๊ฐ€์— ์ด๋ฆ„์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

ํŒŒ์ผ ์ด๋ฆ„์€ ๋‹ค์Œ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. HASERL_๋ณ€์ˆ˜_๊ฒฝ๋กœ ์ด๋Š” FORM_,
GET_ ๋ฐ POST_ ๋ณ€์ˆ˜๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์•…์˜์ ์ธ ํด๋ผ์ด์–ธํŠธ๋Š”
์ด๋ฆ„์œผ๋กœ ๋‘ ๋ฒˆ์งธ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜์‹ญ์‹œ์˜ค. ๋ณ€์ˆ˜_๊ฒฝ๋กœ=/ etc / passwd. ์ด์ „ ๋ฒ„์ „
pathspec์„ ์ €์žฅํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ํ•˜์…€ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค. ์— ์œ ์ง€ํ•˜๋‹ค ๋’ค๋กœ
ํ˜ธํ™˜์„ฑ, ์ „์—, name of ์ „์—, ์ผ์‹œ์ ์ธ ํŒŒ์ผ is ๋˜ํ•œ ์ €์žฅ in FORM_๋ณ€์ˆ˜= ๊ณผ
POST_๋ณ€์ˆ˜=. ์ด is ๊ณ ๋ ค ์œ„ํ—˜ํ•œ ๊ณผ ์˜์ƒ์„ ์ง€์› be ์ต์ˆ™ํ•œ.

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๋Š” ๊ฒฝ์šฐ ๋‘ POST ๋ฐ GET ๋ฐฉ๋ฒ•์œผ๋กœ ํ•˜์…€ ๋งŒ ๊ตฌ๋ฌธ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค
์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ ์š”์ฒญํ•˜๊ธฐ ์›น ์„œ๋ฒ„๊ฐ€ ์„ค์ •ํ•œ ๋ณ€์ˆ˜
๋ชจ๋“ ๊ฒƒ์„ ๋ฐ›์•„ ๋“ค์ธ๋‹ค ์˜ต์…˜์ด ์„ค์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, POST ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ํ˜ธ์ถœ๋˜์—ˆ์ง€๋งŒ
some.cgi?foo=bar&otherdata=something์˜ URI์—๋Š” POST ๋ฐ์ดํ„ฐ๊ฐ€ ๊ตฌ๋ฌธ ๋ถ„์„๋˜๊ณ  ํ‘ธ
๊ณผ ๊ธฐํƒ€ ๋ฐ์ดํ„ฐ ๋ณ€์ˆ˜๋Š” ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค.

์›น ์„œ๋ฒ„๊ฐ€ ์ •์˜ํ•˜๋Š” ๊ฒฝ์šฐ HTTP_์ฟ ํ‚ค ํ™˜๊ฒฝ ๋ณ€์ˆ˜, ์ฟ ํ‚ค ๋ฐ์ดํ„ฐ๊ฐ€ ๊ตฌ๋ฌธ ๋ถ„์„๋ฉ๋‹ˆ๋‹ค.
์ฟ ํ‚ค ๋ฐ์ดํ„ฐ๊ฐ€ ๊ตฌ๋ฌธ ๋ถ„์„๋จ ์ „์— GET ๋˜๋Š” POST ๋ฐ์ดํ„ฐ์ด๋ฏ€๋กœ ๋‘ ๋ณ€์ˆ˜์˜ ๊ฒฝ์šฐ
๊ฐ™์€ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋ฉด GET ๋˜๋Š” POST ๋ฐ์ดํ„ฐ๊ฐ€ ์ฟ ํ‚ค ์ •๋ณด๋ฅผ ๋ฎ์–ด์”๋‹ˆ๋‹ค.

๋™์ผํ•œ ๋ณ€์ˆ˜์˜ ์—ฌ๋Ÿฌ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋‹ค๋ฅธ ์†Œ์Šค์—์„œ ์ „์†ก๋  ๋•Œ
FORM_variable์€ ๋ณ€์ˆ˜๊ฐ€ ์ฒ˜๋ฆฌ๋˜๋Š” ์ˆœ์„œ์— ๋”ฐ๋ผ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.
HTTP_COOKIE๊ฐ€ ํ•ญ์ƒ ๋จผ์ € ์ฒ˜๋ฆฌ๋˜๊ณ  ๊ทธ ๋’ค์— REQUEST_METHOD๊ฐ€ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋‘ ์ˆ˜๋ฝํ•˜๋Š” ๊ฒฝ์šฐ
์˜ต์…˜์ด ์„ค์ •๋˜๋ฉด HTTP_COOKIE๊ฐ€ ๋จผ์ € ์ฒ˜๋ฆฌ๋˜๊ณ  ๊ทธ ๋‹ค์Œ์—๋Š” not ๋ฉ”์„œ๋“œ๊ฐ€ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
REQUEST_METHOD ๋‹ค์Œ์— REQUEST_METHOD๊ฐ€ ์ง€์ •๋ฉ๋‹ˆ๋‹ค. ์˜ ๋งˆ์ง€๋ง‰ ์ธ์Šคํ„ด์Šค
๋ณ€์ˆ˜๋Š” FORM_variable์„ ์„ค์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ณ€์ˆ˜๋„ ๋ณ„๋„๋กœ
COOKIE_variable, GET_variable ๋ฐ POST_variable๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋‹ค์Œ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ฐ ์†Œ์Šค์˜ ์ค‘๋ณต ์ด๋ฆ„.

๋™์ผํ•œ ์†Œ์Šค์—์„œ ๋™์ผํ•œ ๋ณ€์ˆ˜์˜ ์—ฌ๋Ÿฌ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ „์†ก๋˜๋ฉด ๋งˆ์ง€๋ง‰
ํ•˜๋‚˜๋Š” ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ณต์‚ฌ๋ณธ์„ ์œ ์ง€ํ•˜๋ ค๋ฉด(์˜ˆ: ๋‹ค์ค‘ ์„ ํƒ์˜ ๊ฒฝ์šฐ) ๋์— "[]"๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
๋ณ€์ˆ˜ ์ด๋ฆ„์˜. ๋ชจ๋“  ๊ฒฐ๊ณผ๊ฐ€ ์ค„ ๋ฐ”๊ฟˆ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด,
host=Enoch&host=Esther&host=Joshua๋Š” "FORM_host=Joshua"๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
host[]=Enoch&host[]Esther&host[]=Joshua ๊ฒฐ๊ณผ "FORM_host=Enoch\nEsther\nJoshua"

์–ธ์–ด


๋‹ค์Œ ์–ธ์–ด ๊ตฌ์กฐ๋Š” ํ•˜์…€.

์šด์˜
<% [์‰˜ ์Šคํฌ๋ฆฝํŠธ] %>

<% %> ํƒœ๊ทธ๋กœ ๋‘˜๋Ÿฌ์‹ธ์ธ ๋ชจ๋“  ํ•ญ๋ชฉ์€ ์‹คํ–‰์„ ์œ„ํ•ด ํ•˜์œ„ ์…ธ๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ํ…์ŠคํŠธ
๋ฌธ์ž ๊ทธ๋Œ€๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.

ํฌํ•จ
<%in pathspec %>

์ด ์Šคํฌ๋ฆฝํŠธ์— ๋‹ค๋ฅธ ํŒŒ์ผ์„ ๊ทธ๋Œ€๋กœ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ์€ ์Šคํฌ๋ฆฝํŠธ๊ฐ€
์ฒ˜์Œ์— ํŒŒ์‹ฑ๋ฉ๋‹ˆ๋‹ค.

ํ‰๊ฐ€
<%= ํ‘œํ˜„์‹ %>

์‰˜ ํ‘œํ˜„์‹์„ ์ธ์‡„ํ•˜์‹ญ์‹œ์˜ค. "echo expr"์— ๋Œ€ํ•œ ๊ตฌ๋ฌธ ์„คํƒ•.

๋ฐฉ๋ฒ•
<%# ์ฝ”๋ฉ˜ํŠธ %>

๋Œ“๊ธ€ ๋ธ”๋ก. ์ฃผ์„ ๋ธ”๋ก์˜ ๋‚ด์šฉ์€ ๊ตฌ๋ฌธ ๋ถ„์„๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฃผ์„์€ ์ค‘์ฒฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹ค๋ฅธ haserl ์š”์†Œ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ ์˜ˆ


๊ฒฝ๊ณ 
์•„๋ž˜ ์˜ˆ์ œ๋Š” ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ๋‹จ์ˆœํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์…€. ๋‹น์‹ ์€ํ•ด์•ผํ•œ๋‹ค
์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๊ธฐ๋ณธ ์›น ์Šคํฌ๋ฆฝํŒ… ๋ณด์•ˆ์— ์ต์ˆ™ํ•จ ํ•˜์…€ (๋˜๋Š” ์Šคํฌ๋ฆฝํŒ…
์–ธ์–ด) ์ƒ์‚ฐ ํ™˜๊ฒฝ์—์„œ.

๋‹จ์ˆœ, ๊ฐ„๋‹จ, ํŽธ๋ฆฌ ๋ช…๋ น
#!/usr/local/bin/haserl
์ฝ˜ํ…์ธ  ์œ ํ˜•: ํ…์ŠคํŠธ/์ผ๋ฐ˜

<%# ์ƒ˜ํ”Œ "env" ์Šคํฌ๋ฆฝํŠธ์ž…๋‹ˆ๋‹ค %>
<%ํ™˜๊ฒฝ%>

์˜ ๊ฒฐ๊ณผ๋ฅผ ์ธ์‡„ํ•ฉ๋‹ˆ๋‹ค. ํ™˜๊ฒฝ ๋ช…๋ น์„ MIME ์œ ํ˜• "ํ…์ŠคํŠธ/์ผ๋ฐ˜" ๋ฌธ์„œ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€
์ „์—, ํ•˜์…€ ์ผ๋ฐ˜์ ์ธ ๋ฒ„์ „ ์ธ์‡„ cgi.cgi

๋ฃจํ•‘ ๊ณผ ๋™์  ์ถœ๋ ฅ
#!/usr/local/bin/haserl
์ฝ˜ํ…์ธ  ์œ ํ˜•: ํ…์ŠคํŠธ/html




<๋นจ๊ฐ„์ƒ‰ ํŒŒ๋ž€์ƒ‰ ๋…ธ๋ž€์ƒ‰ ์ฒญ๋ก์ƒ‰์˜ a์— ๋Œ€ํ•œ %; ํ•  %>
"><% ์—์ฝ” -n "$a" %>
<% ์™„๋ฃŒ %>




MIME ํ˜•์‹์˜ "text/html" ๋ฌธ์„œ๋ฅผ html ํ…Œ์ด๋ธ”๊ณผ ํ•จ๊ป˜ ํด๋ผ์ด์–ธํŠธ์— ๋ณด๋ƒ…๋‹ˆ๋‹ค.
๋ฐฐ๊ฒฝ์ƒ‰์œผ๋กœ ๋ ˆ์ด๋ธ”์ด ์ง€์ •๋œ ์š”์†Œ.

๊ป์งˆ ํ•œ์ •๋œ ๊ธฐ๋Šฅ.
#!/usr/local/bin/haserl
์ฝ˜ํ…์ธ  ์œ ํ˜•: ํ…์ŠคํŠธ/html

<% # ์‚ฌ์šฉ์ž ํ•จ์ˆ˜ ์ •์˜
ํ…Œ์ด๋ธ” ์š”์†Œ() {
์—์ฝ” " $1 "
}
%>



<๋นจ๊ฐ„์ƒ‰ ํŒŒ๋ž€์ƒ‰ ๋…ธ๋ž€์ƒ‰ ์ฒญ๋ก์ƒ‰์˜ a์— ๋Œ€ํ•œ %; ํ•  %>
<% table_element $a %>
<% ์™„๋ฃŒ %>




์œ„์™€ ๋™์ผํ•˜์ง€๋งŒ ์ž„๋ฒ ๋””๋“œ html ๋Œ€์‹  ์‰˜ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์…€ํ”„ ์ฐธ์กฐ CGI ๊ณผ a ํ˜•ํƒœ
#!/usr/local/bin/haserl
์ฝ˜ํ…์ธ  ์œ ํ˜•: ํ…์ŠคํŠธ/html


์ƒ˜ํ”Œ ์–‘์‹
" method="GET">
<% # FORM_textfield์˜ ๊ธฐ๋ณธ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
# ์ผ๋ฐ˜์ ์ธ ์›น ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด
FORM_textfield=$( echo "$FORM_textfield" | sed "s/[^A-Za-z0-9 ]//g" )
%>
<์ž…๋ ฅ ์œ ํ˜•=ํ…์ŠคํŠธ ์ด๋ฆ„=ํ…์ŠคํŠธ ํ•„๋“œ
๊ฐ’="<% echo -n "$FORM_textfield" | tr az AZ %>" cols=20>




์–‘์‹์„ ์ธ์‡„ํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์–‘์‹์— ํ…์ŠคํŠธ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด CGI๊ฐ€ ๋‹ค์‹œ ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค(์ •์˜๋จ).
by $SCRIPT_NAME) ์›น ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํ…์ŠคํŠธ ํ•„๋“œ๋ฅผ ์‚ญ์ œํ•œ ๋‹ค์Œ
์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ํ…์ŠคํŠธ๋กœ ์–‘์‹์ด ๋‹ค์‹œ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ํ…์ŠคํŠธ๋Š” ๋Œ€๋ฌธ์ž์ž…๋‹ˆ๋‹ค.

์—…๋กœ๋“œ a ์ž…์–‘ ๋ถ€๋ชจ๋กœ์„œ์˜ ๊ท€ํ•˜์˜ ์ ํ•ฉ์„ฑ์„ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋ฏธ๊ตญ ์ด๋ฏผ๊ตญ์—
#!/usr/local/bin/haserl --์—…๋กœ๋“œ ์ œํ•œ=4096 --์—…๋กœ๋“œ ๋””๋ ‰ํ„ฐ๋ฆฌ=/ TMP
์ฝ˜ํ…์ธ  ์œ ํ˜•: ํ…์ŠคํŠธ/html


" method=POST enctype="multipart/form-data" >



<% if test -n "$HASERL_uploadfile_path"; ๊ทธ๋Ÿผ %>

<% echo -n $FORM_uploadfile_name %> ํŒŒ์ผ์„ ์—…๋กœ๋“œํ–ˆ์œผ๋ฉฐ
. ์ž„์‹œ๋กœ ์„œ๋ฒ„์— ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋งŒํผ
ํŒŒ์ผ์€ <% cat $HASERL_uploadfile_path | wc -c %> ๋ฐ”์ดํŠธ ๊ธธ์ด.
<% rm -f $HASERL_uploadfile_path %> ๊ฑฑ์ •ํ•˜์ง€ ๋งˆ์„ธ์š”. ํŒŒ์ผ์ด ๋ฐฉ๊ธˆ ์‚ญ์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์›น ์„œ๋ฒ„์—์„œ.
<% ๋‹ค๋ฅธ %>
์•„์ง ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
<% fi %>



ํŒŒ์ผ ์—…๋กœ๋“œ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ์–‘์‹์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.
--์—…๋กœ๋“œ ์ œํ•œ ๊ทธ๋ฆฌ๊ณ  ์–‘์‹์„ ์„ค์ •ํ•˜์—ฌ ์ธ์ฝ”๋”ฉ ์— ๋ฉ€ํ‹ฐํŒŒํŠธ/ํผ ๋ฐ์ดํ„ฐ. ๊ฒฝ์šฐ
ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํŒŒ์ผ์„ ๋ณด๋‚ธ ๋‹ค์Œ ํŒŒ์ผ์— ๋Œ€ํ•œ ์ผ๋ถ€ ์ •๋ณด๊ฐ€ ์ธ์‡„๋œ ๋‹ค์Œ
์‚ญ์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์–‘์‹์— ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•˜์ง€ ์•Š์•˜๋‹ค๊ณ  ๋ช…์‹œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

RFC-2616 ์ ํ•ฉ์„ฑ
#!/usr/local/bin/haserl
<% ์—์ฝ” -en "์ฝ˜ํ…์ธ  ์œ ํ˜•: ํ…์ŠคํŠธ/html\r\n\r\n" %>

...


HTTP ์‚ฌ์–‘์„ ์™„์ „ํžˆ ์ค€์ˆ˜ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ—ค๋”๋ฅผ ์ข…๋ฃŒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ผ๋ฐ˜ ์œ ๋‹‰์Šค LF ๋ผ์ธ ์ข…๋ฃŒ ์ „์šฉ์ด ์•„๋‹Œ CR+LF. ์œ„์˜ ๊ตฌ๋ฌธ์€
RFC 2616 ์ค€์ˆ˜ ํ—ค๋”๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

ํ™˜๊ฒฝ


์›น ์„œ๋ฒ„์—์„œ ์ƒ์†๋ฐ›์€ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์™ธ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€
ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋Š” ํ•ญ์ƒ ์‹œ์ž‘ํ•  ๋•Œ ์ •์˜๋ฉ๋‹ˆ๋‹ค.

ํ•˜์…€๋ฒ„
ํ•˜์…€ ๋ฒ„์ „ - ์ •๋ณด ํƒœ๊ทธ์ž…๋‹ˆ๋‹ค.

์„ธ์…˜ ID
CGI ์ˆ˜๋ช… ๋™์•ˆ ๊ณ ์œ ํ•œ XNUMX์ง„์ˆ˜ ํƒœ๊ทธ์ž…๋‹ˆ๋‹ค.
cgi๊ฐ€ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ POST ๋˜๋Š” GET ์ฟผ๋ฆฌ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ๊นŒ์ง€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)

HASERL_ACCEPT_ALL
๊ฒฝ์šฐ --๋ชจ๋“ ๊ฒƒ์„ ๋ฐ›์•„ ๋“ค์ธ๋‹ค ๊นƒ๋ฐœ์„ ๊ฝ‚์•˜๊ณ , -1๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 0.

HASERL_SHELL
ํ•˜์œ„ ์…ธ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ธฐ ์‹œ์ž‘ํ•œ ์…ธ haserl์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

HASERL_UPLOAD_DIR
๋””๋ ‰ํ† ๋ฆฌ haserl์€ ์—…๋กœ๋“œ๋œ ํŒŒ์ผ์„ ์ €์žฅํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

HASERL_UPLOAD_LIMIT
ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” KB ์ˆ˜์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ณ€์ˆ˜๋Š” ์Šคํฌ๋ฆฝํŠธ ๋‚ด์—์„œ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
"HASERL_"๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์€ ์ •๋ณด์šฉ์ผ ๋ฟ์ด๋ฉฐ ์‹คํ–‰ ์ค‘์ธ ์Šคํฌ๋ฆฝํŠธ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์•ˆ์ „ STYLE


์‰˜์„ ์‚ฌ์šฉํ•˜์—ฌ CGI ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๋Š” ๊ฒƒ์˜ ์œ„ํ—˜์„ฑ์— ๊ด€ํ•œ ๋งŽ์€ ๋ฌธํ—Œ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
ํ•˜์…€ ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค ์ผ๋ถ€ ์ด ์œ„ํ—˜์„ ์™„ํ™”ํ•˜๊ธฐ ์œ„ํ•œ ๋ณดํ˜ธ.

ํ™˜๊ฒฝ ๋ณ€์ˆ˜
ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ฑ„์šฐ๋Š” ์ฝ”๋“œ๋Š” ํ•˜์œ„ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚ฉ๋‹ˆ๋‹ค.
๊ป๋ฐ๊ธฐ. ๋ฌธ์ž๋ฅผ ํŒŒ์‹ฑํ•ฉ๋‹ˆ๊นŒ? ๋ฐ &, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋” ์–ด๋ ต์Šต๋‹ˆ๋‹ค.
"์ฃผ์ž…" ๊ณต๊ฒฉ. ์˜ˆ๋กœ์„œ, foo.cgi?a=ํ…Œ์ŠคํŠธ;๊ณ ์–‘์ด / etc / passwd ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
๊ฐ’์ด ํ• ๋‹น๋˜๋Š” ๋ณ€์ˆ˜ test ๊ทธ๋ฆฌ๊ณ  ์‹คํ–‰ ๊ฒฐ๊ณผ ๋ฐฉ๋ฒ•
/ etc / passwd ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „์†ก๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์„ค ๋ณ€์ˆ˜์— ์™„๋ฃŒ๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค
๊ฐ’ : ํ…Œ์ŠคํŠธ;๊ณ ์–‘์ด / etc / passwd

์…ธ ์Šคํฌ๋ฆฝํŠธ์—์„œ ์ด "์œ„ํ—˜ํ•œ" ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.
์ธ์šฉ ๋ถ€ํ˜ธ; ๋ชจ๋“  ์ž…๋ ฅ ํ•„๋“œ์— ๋Œ€ํ•ด ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜์ง€๋งŒ.

ํŠน๊ถŒ ์ ํ•˜
suid ์Šคํฌ๋ฆฝํŠธ๋กœ ์„ค์น˜ํ•˜๋ฉด ํ•˜์…€ uid/gid๋ฅผ ์†Œ์œ ์ž์˜ uid/gid๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
๋Œ€๋ณธ. ์ด๊ฒƒ์€ ๋‹ค์–‘ํ•œ CGI ์Šคํฌ๋ฆฝํŠธ ์„ธํŠธ๋ฅผ ๊ฐ–๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํŠน๊ถŒ. ๋งŒ์•ฝ ํ•˜์…€ ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ suid๋กœ ์„ค์น˜๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ CGI ์Šคํฌ๋ฆฝํŠธ๋Š”
์›น ์„œ๋ฒ„์˜ uid/gid๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๊ฑฐ์ ˆ ๋ช…๋ น ์„  ๋งค๊ฐœ ๋ณ€์ˆ˜ ์ฃผ์–ด์ง„ on ์ „์—, URL
URL์— ์ธ์ฝ”๋”ฉ๋˜์ง€ ์•Š์€ "="๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด CGI ์‚ฌ์–‘์— ์˜ต์…˜์ด ๋ช…์‹œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•œ ๋ช…๋ น์ค„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด,
CGI ์‚ฌ์–‘: http://192.168.0.1/test.cgi?--์—…๋กœ๋“œ ์ œํ•œ%3d2000&foo%3dbar
"Foo=bar" ์„ค์ • ์™ธ์— ์—…๋กœ๋“œ ์ œํ•œ์„ 2000KB๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•ด
์ž์ฒด ์—…๋กœ๋“œ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ์— ๋Œ€ํ•ด ํ•˜์…€ ๋ชจ๋“  ๋ช…๋ น์ค„ ์˜ต์…˜์„ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค.
argv[2] ๋„ˆ๋จธ. #! ์Šคํฌ๋ฆฝํŠธ, ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋Š” argv[0], ๋ชจ๋‘
#! ๋ผ์ธ์€ argv[1]๋กœ ๊ฒฐํ•ฉ๋˜๊ณ 
์Šคํฌ๋ฆฝํŠธ ์ด๋ฆ„์€ argv[2]์ž…๋‹ˆ๋‹ค.

LUA


๋ฃจ์•„ ์ง€์›์œผ๋กœ ์ปดํŒŒ์ผํ•˜๋ฉด --์‰˜=๋ฃจ์•„ ๋Œ€์‹  ์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด๋กœ lua๋ฅผ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.
bash ์‰˜์˜. ํ™˜๊ฒฝ ๋ณ€์ˆ˜(SCRIPT_NAME, SERVER_NAME ๋“ฑ)๋Š”
ENV ํ…Œ์ด๋ธ”๊ณผ ์–‘์‹ ๋ณ€์ˆ˜๋Š” FORM ํ…Œ์ด๋ธ”์— ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด,
์œ„์˜ ์ž๊ธฐ ์ฐธ์กฐ ํ˜•์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

#!/usr/local/bin/haserl --shell=๋ฃจ์•„
์ฝ˜ํ…์ธ  ์œ ํ˜•: ํ…์ŠคํŠธ/html


์ƒ˜ํ”Œ ์–‘์‹
" ๋ฐฉ๋ฒ•="๊ฐ€์ ธ์˜ค๊ธฐ">
<% # FORM_textfield์˜ ๊ธฐ๋ณธ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
# ์ผ๋ฐ˜์ ์ธ ์›น ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด
FORM.textfield=string.gsub(FORM.textfield, "[^%a%d]", "")
%>
<์ž…๋ ฅ ์œ ํ˜•=ํ…์ŠคํŠธ ์ด๋ฆ„=ํ…์ŠคํŠธ ํ•„๋“œ
๊ฐ’="<% io.write (string.upper(FORM.textfield)) %>" cols=20>




<%= ์—ฐ์‚ฐ์ž๋Š” ๋‹ค์Œ์— ๋Œ€ํ•œ ๊ตฌ๋ฌธ ์„คํƒ•์ž…๋‹ˆ๋‹ค. io.์“ฐ๊ธฐ (tostring( ... )) ์˜ˆ๋ฅผ ๋“ค์–ด
Value= ์œ„์˜ ์ค„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ’="<%= string.upper(FORM.ํ…์ŠคํŠธ ํ•„๋“œ) %>" ์—ด = 20>

haserl lua ์Šคํฌ๋ฆฝํŠธ๋Š” ๋‹ค์Œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. haserl.๋กœ๋“œํŒŒ์ผ(ํŒŒ์ผ ์ด๋ฆ„) ๋Œ€์ƒ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด
haserl(lua) ์Šคํฌ๋ฆฝํŠธ๋กœ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜๋Š” "ํ•จ์ˆ˜" ์œ ํ˜•์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด,

๋ฐ”.lsp
<% io.write ("Hello World" ) %>

๊ท€ํ•˜์˜ ๋ฉ”์‹œ์ง€๋Š” <%= gvar %>์ž…๋‹ˆ๋‹ค.

-- ์ธํด๋ฃจ๋“œ ํŒŒ์ผ ๋ --

foo.haserl
#!/usr/local/bin/haserl --shell=๋ฃจ์•„
<% m = haserl.loadfile("bar.lsp")
gvar = "m()์œผ๋กœ ์‹คํ–‰"
๋ฏธ๋””์—„()

gvar = "ํ•œ ๋ฒˆ์— ๋กœ๋“œ ๋ฐ ์‹คํ–‰"
haserl.loadfile("bar.lsp")()
%>

๋‹ฌ๋ฆฌ๋Š” ํ‘ธ ๋‹ค์Œ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”
๊ท€ํ•˜์˜ ๋ฉ”์‹œ์ง€๋Š” m()์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
-- ์ธํด๋ฃจ๋“œ ํŒŒ์ผ ๋ --
์•ˆ๋…•ํ•˜์„ธ์š”
๊ท€ํ•˜์˜ ๋ฉ”์‹œ์ง€๋Š” ํ•œ ๋‹จ๊ณ„์—์„œ ๋กœ๋“œ ๋ฐ ์‹คํ–‰์ž…๋‹ˆ๋‹ค.
-- ์ธํด๋ฃจ๋“œ ํŒŒ์ผ ๋ --

์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ค‘์ฒฉ๋œ haserl ์„œ๋ฒ„ ํŽ˜์ด์ง€ - ํŽ˜์ด์ง€ ์Šค๋‹ˆํŽซ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
haserl ํ† ํฌ๋‚˜์ด์ €์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

๋ฃจ์•…


XNUMXD๋ดํƒˆ์˜ ๋ฃจ์•… "shell"์€ ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผ๋œ lua ์ฒญํฌ์ด๋ฏ€๋กœ ์Šคํฌ๋ฆฝํŠธ์˜ ๋Œ€ํ™”์‹ ํŽธ์ง‘ ๋ฐ ํ…Œ์ŠคํŠธ
๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ haserl์€ luac ์ง€์›์œผ๋กœ๋งŒ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ž‘์€ ๋ฉ”๋ชจ๋ฆฌ ํ™˜๊ฒฝ์—์„œ๋„ ๋ฃจ์•„๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์œ„์— ๋‚˜์—ด๋œ ๋ชจ๋“  haserl lua ๊ธฐ๋Šฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์•„์ง ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (luac์ด haserl์— ๋‚ด์žฅ๋œ ์œ ์ผํ•œ ์‰˜์ด๋ผ๋ฉด haserl.loadfile์€
haserl ํŒŒ์„œ๊ฐ€ ์ปดํŒŒ์ผ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋น„ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.)

๋‹ค์Œ์€ luac cgi ์Šคํฌ๋ฆฝํŠธ๋กœ ๋ณ€ํ™˜๋œ ์‚ฌ์†Œํ•œ ์Šคํฌ๋ฆฝํŠธ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค.

test.lua ํŒŒ์ผ์ด ์ฃผ์–ด์ง„ ๊ฒฝ์šฐ:
์ธ์‡„("์ฝ˜ํ…์ธ  ์œ ํ˜•: ํ…์ŠคํŠธ/์ผ๋ฐ˜0)
print("์ด ์‹คํ–‰์— ๋Œ€ํ•œ UUID๋Š”: " .. ENV.SESSIONID)

๋‹ค์Œ๊ณผ ๊ฐ™์ด luac์œผ๋กœ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฃจ์•… -o ํ…Œ์ŠคํŠธ.๋ฃจ์•… -s ํ…Œ์ŠคํŠธ.๋ฃจ์•„

๊ทธ๋Ÿฐ ๋‹ค์Œ haserl ํ—ค๋”๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
echo '#!/usr/bin/haserl --shell=luac' | ๊ณ ์–‘์ด - test.luac > luac.cgi

๋˜๋Š” ํ‘œ์ค€ lua ์…ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ „์ฒด ์›น ์‚ฌ์ดํŠธ๋ฅผ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ ๋‹ค์Œ haserl ์ž์ฒด๊ฐ€ luac ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ a์˜ ์ผ๋ถ€๋กœ ์‚ฌ์ „ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค. ์ด๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด --shell=lua๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์›น ์‚ฌ์ดํŠธ๋ฅผ ๊ฐœ๋ฐœํ•˜์‹ญ์‹œ์˜ค. ๋นŒ๋“œํ•  ์ค€๋น„๊ฐ€ ๋˜๋ฉด
๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ์—์„œ --debug ์ค„์„ lua ์Šคํฌ๋ฆฝํŠธ์— ์ถ”๊ฐ€ํ•˜๊ณ  ์ถœ๋ ฅ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
.lua ์†Œ์Šค ํŒŒ์ผ์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ. ์˜ˆ๋ฅผ ๋“ค์–ด:

์ฃผ์–ด์ง„ haserl ์Šคํฌ๋ฆฝํŠธ test.cgi:
#!/usr/bin/haserl --shell=lua --debug
์ฝ˜ํ…์ธ  ์œ ํ˜•: ํ…์ŠคํŠธ/์ผ๋ฐ˜

์ด ์‹คํ–‰์— ๋Œ€ํ•œ UUID๋Š” <%= ENV.SESSIONID %>์ž…๋‹ˆ๋‹ค.

haserl luac ํ—ค๋”๋ฅผ ์‚ฌ์ „ ์ปดํŒŒ์ผ, ์ปดํŒŒ์ผ ๋ฐ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
./test.cgi > test.lua
๋ฃจ์•… -s -o ํ…Œ์ŠคํŠธ.๋ฃจ์•… ํ…Œ์ŠคํŠธ.๋ฃจ์•„
echo '#!/usr/bin/haserl --shell=luac' | ๊ณ ์–‘์ด - test.luac > luac.cgi

onworks.net ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜จ๋ผ์ธ์—์„œ haserl ์‚ฌ์šฉ


๋ฌด๋ฃŒ ์„œ๋ฒ„ ๋ฐ ์›Œํฌ์Šคํ…Œ์ด์…˜

Windows ๋ฐ Linux ์•ฑ ๋‹ค์šด๋กœ๋“œ

  • 1
    ํŽ˜์ด์ €
    ํŽ˜์ด์ €
    Phaser๋Š” ๋น ๋ฅด๊ณ  ๋ฌด๋ฃŒ์ด๋ฉฐ ์žฌ๋ฏธ์žˆ๋Š” ๊ณต๊ฐœ ํ”„๋กœ๊ทธ๋žจ์ž…๋‹ˆ๋‹ค.
    ์ œ๊ณตํ•˜๋Š” ์†Œ์Šค HTML5 ๊ฒŒ์ž„ ํ”„๋ ˆ์ž„์›Œํฌ
    WebGL ๋ฐ ์บ”๋ฒ„์Šค ๋ Œ๋”๋ง
    ๋ฐ์Šคํฌํ†ฑ ๋ฐ ๋ชจ๋ฐ”์ผ ์›น ๋ธŒ๋ผ์šฐ์ €. ๊ณ„๋žต
    ๊ณต๋™ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ...
    ํŽ˜์ด์ € ๋‹ค์šด๋กœ๋“œ
  • 2
    ๋ฐ”์‚ด ์—”์ง„
    ๋ฐ”์‚ด ์—”์ง„
    VASSAL์€ ์ œ์ž‘์„ ์œ„ํ•œ ๊ฒŒ์ž„ ์—”์ง„์ž…๋‹ˆ๋‹ค.
    ๊ธฐ์กด ๋ณด๋“œ์˜ ์ „์ž ๋ฒ„์ „
    ๊ทธ๋ฆฌ๊ณ  ์นด๋“œ ๊ฒŒ์ž„. ๋‹ค์Œ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
    ๊ฒŒ์ž„ ์กฐ๊ฐ ๋ Œ๋”๋ง ๋ฐ ์ƒํ˜ธ ์ž‘์šฉ,
    ๊ทธ๋ฆฌ๊ณ  ...
    VASSAL ์—”์ง„ ๋‹ค์šด๋กœ๋“œ
  • 3
    OpenPDF - iText์˜ ํฌํฌ
    OpenPDF - iText์˜ ํฌํฌ
    OpenPDF๋Š” ๋‹ค์Œ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ Java ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.
    ๋ฐ LGPL๋กœ PDF ํŒŒ์ผ ํŽธ์ง‘ ๋ฐ
    MPL ์˜คํ”ˆ ์†Œ์Šค ๋ผ์ด์„ ์Šค. OpenPDF๋Š”
    iText์˜ LGPL/MPL ์˜คํ”ˆ ์†Œ์Šค ํ›„๊ณ„์ž,
    ์—์ด...
    OpenPDF ๋‹ค์šด๋กœ๋“œ - iText ํฌํฌ
  • 4
    ์‚ฌ๊ฐ€ GIS
    ์‚ฌ๊ฐ€ GIS
    SAGA - ์ž๋™ํ™” ์‹œ์Šคํ…œ
    Geoscientific ๋ถ„์„ - ์ง€๋ฆฌ์ ์ž…๋‹ˆ๋‹ค
    ์ •๋ณด ์‹œ์Šคํ…œ(GIS) ์†Œํ”„ํŠธ์›จ์–ด
    ์ง€๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์œ„ํ•œ ์—„์ฒญ๋‚œ ๊ธฐ๋Šฅ
    ์ฒ˜๋ฆฌ ๋ฐ ์•„๋‚˜...
    ์‚ฌ๊ฐ€ GIS ๋‹ค์šด๋กœ๋“œ
  • 5
    Java/JTOpen์šฉ ๋„๊ตฌ ์ƒ์ž
    Java/JTOpen์šฉ ๋„๊ตฌ ์ƒ์ž
    IBM Toolbox for Java / JTOpen์€
    ์ง€์›ํ•˜๋Š” Java ํด๋ž˜์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    ํด๋ผ์ด์–ธํŠธ/์„œ๋ฒ„ ๋ฐ ์ธํ„ฐ๋„ท ํ”„๋กœ๊ทธ๋ž˜๋ฐ
    OS/400์„ ์‹คํ–‰ํ•˜๋Š” ์‹œ์Šคํ…œ์— ๋ชจ๋ธ,
    i5/OS, ์˜ค...
    Java/JTOpen์šฉ ๋„๊ตฌ ์ƒ์ž ๋‹ค์šด๋กœ๋“œ
  • 6
    D3.js
    D3.js
    D3.js(๋˜๋Š” ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜ ๋ฌธ์„œ์˜ ๊ฒฝ์šฐ D3)
    ํ•  ์ˆ˜ ์žˆ๋Š” JavaScript ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.
    ๋™์ , ๋Œ€ํ™”ํ˜• ๋ฐ์ดํ„ฐ ์ƒ์„ฑ
    ์›น ๋ธŒ๋ผ์šฐ์ €์˜ ์‹œ๊ฐํ™”. D3์™€ ํ•จ๊ป˜
    ๋‹น์‹ ...
    D3.js ๋‹ค์šด๋กœ๋“œ
  • ๋”ยป

Linux ๋ช…๋ น

Ad