I am LAZY bones ? all linux

2018年 03月 的归档

记一下这个bash的http server

很久之前找到的小脚本,比较方便,可以基于此,自己在里面写各种逻辑,比如之前我是给改成做30x的跳转(根据输出参数,跳转到不同url),还是很合适的。
最近又想用,发现几乎找不到了,很多收藏的链接都已经失效了,于是觉得还是应该在自己能把控的地方记录下,把代码帖这个里吧,这个的效果和 python 的 SimpleHTTPServer 有点类似。
注意,这个脚本没有任何安全性可言,可以通过..访问到上级目录,也可能通过``执行任意指令,所以最好别长期开着。这只是个例子,处理逻辑自己改。

#!/usr/bin/env bash
while true
do
  f="/tmp/out$RANDOM"
  mkfifo "$f"
  trap "rm -f $f" EXIT
  cat "$f" | nc -4l 8000 > >(
    export REQUEST=
    while read -r line
    do
      line=$(echo "$line" | tr -d '\r\n')
      echo $line
      if echo "$line" | grep -qE '^GET /' ; then
        REQUEST=$(echo "$line" | cut -d ' ' -f2)
      elif [ -z "$line" ] ; then
        ( #这里面写自己的处理逻辑,这是一个很丑的例子。
        if [ "$REQUEST" == "/" ] ; then
          Message_Body="<!DOCTYPE html><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8></head><body>
`find . -type f -exec ls -l {} \; | awk '{print $1,$2,$3,$4,$5,$6,$7,$8,"<a href=\\"/" $9 "\\">" $9 "</a><br>"}'`</body></html>"
        else
          Message_Body="`cat "./$REQUEST"`"
        fi
        echo -en "HTTP/1.0 200 OK\nContent-Length: ${#Message_Body}\n\n$Message_Body"
        ) > "$f"
     fi
    done
  )
  rm -f "$f"
  echo done, next request.
done

另外,也可以看看几年前的这篇