#!/bin/bash
#########################################################################################################
# 这是一个可以用来做静态 HTTP 的 BASH 脚本。 在 inetd/xinetd 中运行就可以了。
# 对于 php 内容,通过调用 php 命令可以实现完整的 http + php 功能。 Good!
#########################################################################################################
DECODEURL()
{
echo "$1" | \
awk 'BEGIN {
for (i=0;i<=16;i++) hex[sprintf("%X",i)]=i;}
{ for (i=1;i<=length($0);i++)
{ c=substr($0,i,1)
if (c=="+") printf (" ");
else if (c=="%") {
printf ("%c",hex[substr($0,++i,1)]*16+hex[substr($0,++i,1)])
}
else printf (c);
}
} '
}
LANG=en_US.UTF-8
httprootconf=/tmp/httproot
read GET eURL HTTPVER
URL=$(DECODEURL "$eURL")
URI="$URL"
[ -f "${httprootconf}" ] && URL="$( cat "${httprootconf}" )$URL"
# Get HTTP Header
lines=$( awk '{if ($0 == "\r") exit; else{ print ; print "\n" }}')
#Get Ranges
RANGE=$( echo -e "$lines" | sed 's/\r//g'| ( while read eRange Range ; do if [ "$eRange" = "Range:" ] ; then echo $Range ; exit ; fi ; done ) )
RANGE=$( echo "$RANGE" | awk -F"=" '{print $2}')
RANGE_A=$( echo "$RANGE" | awk -F"-" '{print $1}')
RANGE_B=$( echo "$RANGE" | awk -F"-" '{print $2}')
#Get Host
HOST=$( echo -e "$lines" | sed 's/\r//g'| ( while read eHOST HOST ; do if [ "$eHOST" = "Host:" ] ; then echo $HOST ; exit ; fi ; done ) )
if [ -e "$URL" ] ; then
echo -ne "HTTP/1.1 200 OK\r\n"
else
echo -ne "HTTP/1.1 404 Not Found\r\n"
fi
echo -ne "HTTP/1.1 200 OK\r\n"
echo -ne "Server: microcai's Very Simple HTTP index list Script\r\n"
echo -n "Data:" ; date
echo "URL: $URL"
if [ -d "$URL" ] || [ ! -e "$URL" ] ; then
echo "Content-Type: text/html"
else
filelength=$(ls -l "$URL" | awk '{print $5}')
contentlength=${filelength}
echo -n "Content-Type:"
file -b --mime-type "$URL"
echo -n "Content-Length: "
range_b="${RANGE_B}"
if [ -n "${RANGE}" ] ; then
[ -z "${RANGE_B}" ] && range_b="${filelength}"
contentlength=$( echo "${range_b} - ${RANGE_A}" | bc )
fi
echo ${contentlength}
#Content-Range: bytes 4506080-7009200/7009201
echo -ne "Content-Range: bytes $[RANGE_A]-$[range_b-1]/${filelength}\r\n"
fi
echo -e "Connection: close\r\n"
if [ -d "$URL" ] ; then
echo "<HTML>
<HEAD>
<TITLE>Directory /</TITLE>
</HEAD>
"
echo "<body><H1>Directory listing of $URI</H1><UL>"
echo "<LI><A HREF=https://www.linuxidc.com/Linux/2011-12/\"../\">../</A></LI>"
for files in "$URL"/*
do
filename=$( basename "$files" )
if [ -d "$files" ] ; then
echo "<LI><A HREF=https://www.linuxidc.com/Linux/2011-12/\"$filename/\">${filename}/</A></LI>"
else
echo "<LI><A HREF=https://www.linuxidc.com/Linux/2011-12/\"$filename\">${filename}</A></LI>"
fi
done
echo -ne "</UL></UL>
<H2>Microcai Simple HTTP Server by BASH, `date` </H2>
<H3>Copyright 2011; Microcai </H3>
</BODY>
</HTML>
"
elif [ -f "$URL" ] ; then
if [ -z "${RANGE}" ] ; then
cat "$URL"
elif [ -z "${RANGE_B}" ] ; then # dd 性能不好 , 但是为了支持 XX ,无奈
dd if="$URL" ibs=1 skip=${RANGE_A} count=${contentlength}
else
tail -c "+$[RANGE_A+1]" "$URL"
fi
else
echo "Listen to Microcai, the file is really not found! goto <a href=https://www.linuxidc.com/Linux/2011-12/\"/\">Root Index</a>"
fi
用 SHELL 做个静态 HTTP 服务器
内容版权声明:除非注明,否则皆为本站原创文章。