100 lines of BASH script that simply rock!
ATTENTION
This software should be quite safe, since this checks for some nasty tricks like:
- .. in URL
- / in some places
It binds to port specified from the command line.
It serves only files accessible by the user that runs this script from the current directory (not going up).
Script:
#!/bin/bash
function debug {
local severity="$1"
shift
local message="$@"
echo -n "`date -u`" 1>&2
echo -ne '\t' 1>&2
echo -n "$severity" 1>&2
echo -ne '\t' 1>&2
echo "$message" 1>&2
}
function fix_path {
echo -n "$1" | head -n 1 | sed 's|^[/.-]*||' | sed 's|/\.*|/|g'
}
function serve_dir {
local dir="`fix_path "$1"`"
if [ "$dir" = "" ]; then
dir="./"
fi
echo 'HTTP/1.1 200 OK'
echo 'Content-type: text/html;charset=UTF-8'
echo
echo LISTING "$dir"
echo '<br/>'
ls -p "$dir" | sed -e 's|^\(.*\)$|<a href="/'"$dir"'\1">\1</a><br/>|'
}
function serve_file {
echo 'HTTP/1.1 200 OK'
echo 'Content-type: application/x-download-this'
echo
local file="`fix_path "$1"`"
debug INFO serving file "$file"
cat "$file"
}
function process {
local url="`gawk '{print $2}' | head -n 1`"
case "$url" in
*/)
debug INFO Processing "$url" as dir
serve_dir "$url"
break
;;
*)
debug INFO Processing "$url" as file
serve_file "$url"
;;
esac
}
function serve {
local port="$1"
local sin="$2"
local sout="$3"
while debug INFO Running nc; do
nc -l -p "$port" < "$sin" > "$sout" &
pid="$!"
debug INFO Server PID: "$pid"
trap cleanup SIGINT
head -n 1 "$sout" | process > "$sin"
trap - SIGINT
debug INFO Killing nc
kill "$pid"
done
debug INFO Quiting server
}
function cleanup {
debug INFO Caught signal, quitting...
rm -Rf "$tmp_dir"
exit
}
tmp_dir="`mktemp -d -t http_server.XXXXXXXXXX`"
sin="$tmp_dir"/in
sout="$tmp_dir"/out
pid=0
port="$1"
mkfifo "$sin"
mkfifo "$sout"
debug INFO Starting server on port "$port"
serve "$port" "$sin" "$sout"
cleanup
Screenshot Tour
Dependencies
This script depends on nc (netcat package) being installed in PATH. If you have netcat instead of nc, just change the nc in script to netcat.
Wykop
Jeśli temat Ci się podoba, wykop go!
x-download-this ?
Można lepiej:
function serve_file {
local file="‘fix_path "$1"`"
echo ’HTTP/1.1 200 OK'
printf 'Content-type: %s' "`file -i "$file" | cut -d " " -f 2-`"
echo
debug INFO serving file "$file"
cat "$file"
}
A gdzie PHP? :)
CGI czy PHP w trybie CGI mozna do tego typu serwerka dopisac w kolejnych kilku linijkach. serio. :)
Anonymous (82.210.179.178) trzy posty wyżej zaproponował takie wykrywanie mime
można znacznie to uprościć i nie bawić się w cut'owanie wyjścia file, wystarczy dodać opcję b ;) nie wyświetli tego co wycinasz
file -i -b $filename
przykład
rad@ubuntu:~/tmp$ file -i -b 11.jpg
image/jpeg
i would like to develop a bash for controlling all about a server (nginx,fastsgi, php mysql) including their ini etc, where this bash goes with its ini ( see more here http://ajdiaz.wordpress.com/2008/02/09/bash-ini-parser/ )
i hope to work on it with any one of you in a gpl and/or a comcom mode and about the latter please see my site in comcom.wikidot.com or iswith.info
me:) + 99occupy + yes i am angry! + yes again we can + pile + comcomist <= namzezam :)
Yes, some versions of netcat use "-l" instead of "-l -p". Others just the opposite.
Piotr Gabryjeluk
visit my blog
This is awesome! Great work. Bash is not to be underrated.
Zalozenia tego skryptu sa bardzo dobre, ale on zwyczajnie u mnie nie dziala. Sa dwie wersje pakietow netcat i testowalem ten skrypt na obydwu wersjach. Problemy leza jeszcze w innych miejscach. Czy autor zamierza poprawic ten skrypt? Jakby co jestem chetny pomoc.
There's a newer version:
;-)
Piotr Gabryjeluk
visit my blog
Post preview:
Close preview