1

これを開始点として使用して、ブラウザーからラズベリーパイベースのデバイスを制御するための非常に小さな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でサーバーを実行する場合を除いて、これはうまく機能します。常に昇格された特権でサーバーを実行することはおそらく悪い考えだと思います。ポート80でリッスンを開始した後、どうすればsudoを解除できますか?リクエストごとにncコマンドが再実行されているように見えます。

はい、「実際の」軽量Webサーバーを実行できることはわかっていますが、メモリフットプリントをできるだけ小さくしたいので、bashはすでに実行されていると思いました。~/.config/autostart/autorun.desktopまた、インストールをいくつかの.shファイルの追加と、ファイルを使用した実行に限定したいと思います。

4

2 に答える 2

3

1024未満のすべてのポートは、スーパーユーザー用に予約されています(ここを参照)。まだ使用されていない別のポートでサーバーを実行している限り、問題はありません。

于 2013-03-17T19:46:43.317 に答える
2

問題

考えている方法でBashスクリプトの特権を削除することはできません。ただし、スクリプトには実際にはroot権限は必要ありません。特権ポートにバインドするためにそれらを必要とするのはnetcatだけです。

解決

nc -l -p 8080スクリプトを非特権ユーザーとして実行し、に置き換えsudo nc -l -p 80ます。これにより、root権限がスクリプト全体に提供されるのではなく、netcatプロセスに制限されます。

于 2013-03-17T17:58:57.263 に答える