【问题标题】:BASH web server on port 80 without running as root all the time端口 80 上的 BASH Web 服务器,无需一直以 root 身份运行
【发布时间】:2013-03-18 04:08:24
【问题描述】:

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

【问题讨论】:

  • “我认为一直以提升的权限运行服务器可能是个坏主意。” - 已经创建自己的网络服务器是一个非常糟糕的主意。在 bash 中这样做......对于玩具实验来说很好,但其他方面就不行了。
  • nginxPython's Simple HTTP Server(对于一个更简单的用例)可能更适合这里。它们不像 Apache 那样占用大量资源,但比在 Bash 中手动执行此操作更容易:)

标签: bash sudo netcat httpserver


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    问题

    您不能按照您的想法放弃 Bash 脚本中的权限。但是,您的脚本实际上并不需要 root 权限;只有 netcat 需要它们才能绑定到特权端口。

    解决方案

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-20
      • 1970-01-01
      • 1970-01-01
      • 2016-07-12
      • 1970-01-01
      • 1970-01-01
      • 2013-02-19
      • 1970-01-01
      相关资源
      最近更新 更多