Shell脚本实现的⼀个简易Web服务器例⼦分享
假设你想测试⽹页和⼀些CGI,⽽你⼜不想⿇烦Apache安装完整的包。这个快速的shell脚本可能只是你所需要的东西。
简⽽⾔之,⼀个web服务器是⼀个应⽤程序,该应⽤程序将本地⽂本⽂件通过⽹络发送给客户的请求。如果你让另⼀个程序(例如inetd)处理⽹络情况下,web服务器可以减少到只有 cat "⽂件名”发送到stdout。当然,困难将提取部分⽂件名的HTTP请求字符串:任何⼀个Bash脚本⽆法轻易做到。
脚本
我们的脚本应该像其他任何脚本⼀样,加上⼀些定义:
复制代码代码如下:
#!/bin/bash
base=/var/www
inetd将从远程主机接收到的数据传递给我们的脚本,第⼀⾏是标准的HTTP请求,后跟零个或更多的头⽂件。我们记录下请求,并退出休眠:
复制代码代码如下:
read request
while /bin/true; do
read header
[ "$header" == $'\r' ] && break;
done
最⿇烦的部分:从请求的数据中提取URL并在本地⽂件中到对应⽂件:
复制代码代码如下:
url="${request#GET }"
url="${url% HTTP/*}"
filename="$base$url"
返回含有头部信息的⽂件内容。
复制代码代码如下:
if [ -f "$filename" ]; then
echo -e "HTTP/1.1 200 OK\r"
echo -e "Content-Type: `/usr/bin/file -bi \"$filename\"`\r"
echo -e "\r"
cat "$filename"
echo -e "\r"
else
echo -e "HTTP/1.1 404 Not Found\r"
echo -e "Content-Type: text/html\r"
echo -e "\r"
echo -e "404 Not Found\r"
echo -e "Not Found
The requested resource was not found\r"
echo -e "\r"
fi
好了,脚本完了。
安装
为了使它⼯作,你必须添加以下⾏到/f⽂件:
复制代码代码如下:
www stream tcp nowait nobody /usr/local/bin/webd webd
webd就是你刚刚创建的脚本名称。
请注意,如果你的电脑连接这⼀个不安全的⽹络,这个脚本可能不算⼀个聪明的事,因为谁都可以通过80端⼝访问你硬盘上的⽂件。⼀个更好的办法是使⽤ tcpd 来保证只允许本地连接。我会写⼀些相关的信息,发挥你的想象⼒去⼲吧!
什么是CGI
就像这个,WEB服务器是没什么⽤处的,它什么都做不到,⽽且你可以⽤其他⽅法来访问你的⽂件。我们需要CGI的⽀持(哪怕是很简单的)。
理论:不通过⽹络发送⼀个⽂本⽂件,我们运⾏⼀个可执⾏⽂件,并将其输出。在这之前,我们已经处理的HTTP请求的⼀步,建⽴⼀个 QUERY_STRING变量输出到可执⾏⽂件。
要做到这样,你只需要把第三步的代码替换成这个样⼦的就可以了。
复制代码代码如下:
url="${request#GET }"
url="${url% HTTP/*}"
query="${url#*\?}"
url="${url%%\?*}"
filename="$base$url"
if [ "$query" != "$url" -a -x "$filename" ]; then
export QUERY_STRING="$query"
echo -e "HTTP/1.1 200 OK\r"
"$filename"
echo -e "\r"
exit 0
fishell最简单脚本
当然,这个⼩玩意的性能⽆法与Apache相⽐,这只是⼀个⼩玩意。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。