이것은 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으로 전송됩니다. 출구 명령.
하위 셸이 종료되면 하셀 통역사는 최종 정리를 수행하고
그런 다음 종료합니다.
고객 측면 입력
The 하셀 인터프리터는 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 요소를 포함할 수 있습니다.
사용 예
경고
아래 예제는 사용 방법을 보여주기 위해 단순화되었습니다. 하셀. 당신은해야한다
사용하기 전에 기본 웹 스크립팅 보안에 익숙함 하셀 (또는 스크립팅
언어) 생산 환경에서.
단순, 간단, 편리 Command
#!/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 토크나이저에 의해 처리됩니다.
루악
The 루악 "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 사용