我正在构建一个非常小的 http 服务器来从浏览器控制基于树莓派的设备,并以此为起点: http: //paulbuchheit.blogspot.com/2007/04/webserver-in-bash.html
它的核心是:
#!/bin/bash
RESPONSE=/tmp/webresp
[ -p $RESPONSE ] || mkfifo $RESPONSE
while true ; do
( cat $RESPONSE ) | nc -l -p 8080 | (
REQUEST=`while read L && [ " " "<" "$L" ] ; do echo "$L" ; done`
REQ="`echo \"$REQUEST\" | head -n 1`"
echo "[ `date '+%Y-%m-%d %H:%M:%S'` ] $REQ" >>/var/log/http-access.log
if [[ $REQ =~ ^GET\ /a[\ \/\#?] ]]; then
# ...
RESP="<p>You are at A</p><p><a href='/'>Home</a></p>"
elif [[ $REQ =~ ^GET\ /b[\ \/\#?] ]]; then
# ...
RESP="<p>You are at B</p><p><a href='/'>Home</a></p>"
elif [[ $REQ =~ ^GET\ /c[\ \/\#?] ]]; then
# ...
RESP="<p>You are at C</p><p><a href='/'>Home</a></p>"
else
read -r -d '' RESP <<'HTMLDOC'
<h3>Home</h3>
<p><a href='/a'>A</a></p>
<p><a href='/b'>B</a></p>
<p><a href='/c'>C</a></p>
HTMLDOC
fi
cat >$RESPONSE <<EOF
HTTP/1.0 200 OK
Cache-Control: private
Content-Type: text/html
Server: bash/2.0
Connection: Close
Content-Length: ${#RESP}
$RESP
EOF
)
done
它工作得很好,除非我想在端口 80 上运行服务器,我必须 sudo 它。我认为一直以提升的权限运行服务器可能是一个坏主意。开始监听端口 80 后如何取消 sudo?看起来好像 nc 命令在每个请求上都重新运行。
是的,我知道我可以运行一个“真正的”轻量级 Web 服务器,但我想尽可能减少内存占用,而且我认为 bash 已经在运行。另外,我想将安装限制为添加一些 .sh 文件并使用文件运行~/.config/autostart/autorun.desktop
一个