端口80上的BASH Web服务器不是一直以root身份运行

时间:2013-03-17 17:40:12

标签: bash sudo netcat httpserver

我正在构建一个非常小的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文件的文件

2 个答案:

答案 0 :(得分:3)

1024以下的所有端口都是为超级用户保留的(请参阅here)。只要您在另一个尚未使用的端口上运行服务器,您就可以了。

答案 1 :(得分:2)

问题

您无法以您的思维方式删除Bash脚本中的权限。但是,您的脚本实际上不需要root权限;只有 netcat 需要它们才能绑定到特权端口。

解决方案

以非特权用户身份运行您的脚本,并将nc -l -p 8080替换为sudo nc -l -p 80。这将限制netcat进程的root权限,而不是将它们提供给整个脚本。