Virtualbox에 OpenBSD 5.3이 설치되어 있습니다. 웹 서버는 rc.conf의 apache: httpd_flags=""입니다.
httpd.conf
# cat /var/www/conf/httpd.conf
<Directory "/var/www/htdocs/cgi-bin/">
AllowOverride None
Options +ExecCGI
Options None
Order allow,deny
Allow from all
</Directory>
AddHandler cgi-script .cgi
<Location /cgi-bin/*.cgi>
Options +ExecCGI
</Location>
ServerType standalone
ServerRoot "/var/www"
PidFile logs/httpd.pid
ScoreBoardFile logs/apache_runtime_status
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 15
MinSpareServers 5
MaxSpareServers 10
StartServers 5
MaxClients 150
MaxRequestsPerChild 0
MaxCPUPerChild 0
MaxDATAPerChild 0
MaxNOFILEPerChild 0
MaxRSSPerChild 0
MaxSTACKPerChild 0
Include /var/www/conf/modules/*.conf
Port 80
<IfDefine SSL>
Listen 80
Listen 443
</IfDefine>
User www
Group www
ServerAdmin [email protected]
DocumentRoot "/var/www/htdocs"
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory "/var/www/htdocs">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
UserDir disabled
DirectoryIndex index.html
AccessFileName .htaccess
<Files .htaccess>
Order allow,deny
Deny from all
</Files>
UseCanonicalName On
TypesConfig conf/mime.types
DefaultType text/plain
<IfModule mod_mime_magic.c>
MIMEMagicFile conf/magic
</IfModule>
HostnameLookups Off
ErrorLog logs/error_log
LogLevel warn
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
CustomLog logs/access_log common
Alias /icons/ "/var/www/icons/"
<Directory "/var/www/icons">
Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
IndexOptions FancyIndexing
AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip
AddIconByType (TXT,/icons/text.gif) text/*
AddIconByType (IMG,/icons/image2.gif) image/*
AddIconByType (SND,/icons/sound2.gif) audio/*
AddIconByType (VID,/icons/movie.gif) video/*
AddIcon /icons/binary.gif .bin .exe
AddIcon /icons/binhex.gif .hqx
AddIcon /icons/tar.gif .tar
AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv
AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip
AddIcon /icons/a.gif .ps .ai .eps
AddIcon /icons/layout.gif .html .shtml .htm .pdf
AddIcon /icons/text.gif .txt
AddIcon /icons/c.gif .c
AddIcon /icons/p.gif .pl .py
AddIcon /icons/f.gif .for
AddIcon /icons/dvi.gif .dvi
AddIcon /icons/uuencoded.gif .uu
AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl
AddIcon /icons/tex.gif .tex
AddIcon /icons/bomb.gif core
AddIcon /icons/back.gif ..
AddIcon /icons/hand.right.gif README
AddIcon /icons/folder.gif ^^DIRECTORY^^
AddIcon /icons/blank.gif ^^BLANKICON^^
DefaultIcon /icons/unknown.gif
ReadmeName README
HeaderName HEADER
IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t
AddEncoding x-compress Z
AddEncoding x-gzip gz
AddLanguage en .en
AddLanguage fr .fr
AddLanguage de .de
AddLanguage da .da
AddLanguage el .el
AddLanguage it .it
LanguagePriority en fr de
BrowserMatch "Mozilla/2" nokeepalive
BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0
BrowserMatch "RealPlayer 4\.0" force-response-1.0
BrowserMatch "Java/1\.0" force-response-1.0
BrowserMatch "JDK/1\.0" force-response-1.0
<IfDefine SSL>
AddType application/x-x509-ca-cert .crt
AddType application/x-pkcs7-crl .crl
</IfDefine>
<IfModule mod_ssl.c>
SSLPassPhraseDialog builtin
SSLSessionCache dbm:logs/ssl_scache
SSLSessionCacheTimeout 300
SSLMutex sem
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
SSLRandomSeed startup file:/dev/arandom 512
SSLLog logs/ssl_engine_log
SSLLogLevel info
</IfModule>
<IfDefine SSL>
<VirtualHost _default_:443>
DocumentRoot /var/www/htdocs
ServerName new.host.name
ServerAdmin [email protected]
ErrorLog logs/error_log
TransferLog logs/access_log
SSLEngine on
SSLCertificateFile /etc/ssl/server.crt
SSLCertificateKeyFile /etc/ssl/private/server.key
CustomLog logs/ssl_request_log \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>
</IfDefine>
#
문서:
# ls -la /var/www/bin/
total 3284
drwxr-xr-x 2 root daemon 512 Aug 26 10:23 .
drwxr-xr-x 10 root daemon 512 Aug 24 19:09 ..
---------- 1 root bin 250676 Mar 13 01:23 bgpctl
---------- 1 root bin 222004 Mar 13 01:23 ping
---------- 1 root bin 238388 Mar 13 01:23 ping6
-r-xr-xr-x 1 root daemon 10704 Aug 26 09:51 printf
---------- 1 root bin 189236 Mar 13 01:23 traceroute
---------- 1 root bin 193332 Mar 13 01:23 traceroute6
# ls -laR /var/www/htdocs/
total 12
drwxr-xr-x 3 root daemon 512 Aug 26 09:13 .
drwxr-xr-x 10 root daemon 512 Aug 24 19:09 ..
drwxr-xr-x 2 root daemon 512 Aug 26 10:02 cgi-bin
/var/www/htdocs/cgi-bin:
total 16
drwxr-xr-x 2 root daemon 512 Aug 26 10:02 .
drwxr-xr-x 3 root daemon 512 Aug 26 09:13 ..
-rwxr-xr-x 1 root daemon 61 Aug 26 10:24 SEARCH.cgi
#
# cat /var/www/htdocs/cgi-bin/SEARCH.cgi
printf "Content-type: text/html\n\n";
printf hi
#
# which printf
/usr/bin/printf
#
# cksum /usr/bin/printf /var/www/bin/printf
4034907417 10704 /usr/bin/printf
4034907417 10704 /var/www/bin/printf
테스트해 보세요
[user@notebook ~] wget http://domain.foo:8080/cgi-bin/SEARCH.cgi -O -
--2013-08-26 08:09:16-- http://domain.foo:8080/cgi-bin/SEARCH.cgi
Resolving domain.foo (domain.foo)... ::1, 127.0.0.1
Connecting to domain.foo (domain.foo)|::1|:8080... failed: Connection refused.
Connecting to domain.foo (domain.foo)|127.0.0.1|:8080... connected.
HTTP request sent, awaiting response... 500 Internal Server Error
2013-08-26 08:09:16 ERROR 500: Internal Server Error.
[user@notebook ~]
통나무
# cat /var/www/logs/error_log
[Mon Aug 26 10:09:13 2013] [error] [client 10.0.2.2] Premature end of script headers: /htdocs/cgi-bin/SEARCH.cgi
#
테스트를 위해 "printf" 바이너리를 복사했습니다.
묻다: OpenBSD에서 CGI를 활성화하는 방법은 무엇입니까? cgi에서 echo/sed/ifthenelse/tr/head/awk/egrep을 사용하고 싶습니다. (목적은 사용자가 웹 사이트의 "grep"을 파일에서 사용할 수 있도록 하는 것입니다.) printf를 사용한 간단한 테스트조차도 그렇지 않습니다. 일이 안 되겠어요..내가 뭘 놓치고 있는 걸까요?
업데이트 #1: 무엇이 잘못되었나요?
printf "Content-type: text/html\n\n";
SEARCH.cgi의 라인? (문제가 있는 것 같아서..) - /var/www/bin에 printf가 필요한가요? 거기에 복사했지만 여전히 작동하지 않습니다("스크립트 헤더가 너무 일찍 끝났기 때문").
PS: "http://도메인이름.foo:8080"obsd 머신인데, 방금 virtualbox의 포트 포워딩을 사용했습니다.
업데이트#2: cgi 헤더에서 ksh를 제거했습니다(나중에 다시 추가했습니다. 댓글 참조).
업데이트 #3:
# cat error_log
Abort trap
[Thu Aug 29 09:44:09 2013] [error] [client 10.0.2.2] Premature end of script headers: /htdocs/cgi-bin/SEARCH.cgi
# cat /var/www/htdocs/cgi-bin/SEARCH.cgi
#!/bin/ksh
perl -e 'print"Content-type: text/html\n\n";'
#
답변1
먼저 확인해보세요 /var/www/logs/error_log
. 이것이 작동하지 않는 이유에 대한 가장 큰 단서를 제공할 것입니다.
<Directory>
httpd.conf 끝에 설정을 지정 하면 이전 설정이 해당 설정 <Directory "/var/www/htdocs">
을 덮어씁니다. 귀하의 error_log
유언장은 다음과 같습니다:
[error] [client x.x.x.x] Options ExecCGI is off in this directory /htdocs/a/a.cgi
적용하려면 이 위에 배치해야 합니다. 또한 cgi를 실행 파일로 chmod하고 /var/www/htdocs/a
디렉터리를 생성한 사용자를 기반으로 적절한 권한/소유권을 설정해야 할 수도 있습니다.
chroot
OpenBSD는 기본적으로 이것을 사용하므로 명령이 작동하려면 chroot에 넣어야 한다는 점도 주목할 가치가 있습니다 .
Perl을 예로 사용한다고 가정하면 먼저 필요한 디렉터리를 만들어야 합니다.
$ cd /var/www
$ mkdir -p /var/www/usr/{bin,lib,libexec}
다음으로 우리는 Perl이 어떤 라이브러리를 사용하는지 알아내야 합니다:
$ ldd /usr/bin/perl
/usr/bin/perl:
Start End Type Open Ref GrpRef Name
1c000000 3c004000 exe 1 0 0 /usr/bin/perl
07f3f000 27f58000 rlib 0 1 0 /usr/lib/libperl.so.12.0
0d61c000 2d625000 rlib 0 1 0 /usr/lib/libm.so.7.1
0fb24000 2fb28000 rlib 0 1 0 /usr/lib/libutil.so.11.4
01b37000 21b65000 rlib 0 1 0 /usr/lib/libc.so.66.2
0b671000 0b671000 rtld 0 1 0 /usr/libexec/ld.so
chroot에 복사하세요.
$ cp /usr/lib/{libperl.so.12.0,libm.so.7.1,libutil.so.11.4,libc.so.66.2} /var/www/usr/lib
$ cp /usr/libexec/ld.so /var/www/usr/libexec
그리고 Perl 자체도 있습니다.
$ cp /usr/bin/perl /var/www/usr/bin
그런 다음 CGI를 사용할 수 있는지 확인할 수 있습니다.
$ chroot /var/www/ /htdocs/a/a.cgi
Content-type: text/html
Test!