Use Python SimpleHTTPServer to Quickly Serve Filesystem Resources

Python SimpleHTTPServer represents a fast alternative to serve files from a directory on your system via HTTP protocol without the need to install Apache, Nginx or other similar HTTP servers on your system. The main advantage of using Python SimpleHTTPServer is that you don’t have to install anything on your Linux system as long as you have the Python interpreter installed on your machine. Most of the Linux distribution have Python interpreter installed by default and the SimpleHTTPServer is nothing more than a integrated Python module.

This tutorial will present a short Bash script that will help you to set and use the Python SimpleHTTPServer in order to quickly serve different filesystem resources and access files from directories via custom HTTP ports. The name of the Bash script that will be used as a command to manipulate the SimpleHTTPServer will be http-server and will provide three arguments that can be passed to the script: start, stop and status.

 

 

STEP ONE – Create http-server Bash Command to Handle SimpleHTTPServer

1. The first thing that you should take into consideration is to create http-server bash script on a system executable path (defined by $PATH environment variable), preferably on a local executable path in order not to mess with system commands. For the purpose of demonstration I will use the port 8081 for SimpleHTPPServer in order to access all the files that reside on /var/log/ path via HTTP protocol.

So, let’s start creating the http-server Bash script on a local executable path with nano editor by issuing the following command:

[terminal]
sudo nano /usr/local/bin/http-server
[/terminal]

 

2. Once the file is opened for editing add the below content (use copy-paste):

 

[terminal]
#!/bin/bash

WWW_PORT=’8081′
WWW_PATH="/var/log/"

case $1 in
start)
cd $WWW_PATH
nohup python -m SimpleHTTPServer $WWW_PORT >> /tmp/nohup.log 2>&1 &
sleep 2
stat=`netstat -tlpn | grep $WWW_PORT | grep "python" | cut -d":" -f2 | cut -d" " -f1`
if [[ $WWW_PORT -eq $stat ]]; then
sock=`netstat -tlpn | grep $WWW_PORT | grep "python"`
echo -e "Server is running:\n$sock"
else
echo -e "Server is stopped"
fi
;;

stop)
pid=`ps -ax | grep "[S]impleHTTPServer $WWW_PORT"| awk ‘{print $1}’`
kill -9 $pid 2>/dev/null
rm -f /tmp/nohup.log
stat=`netstat -tlpn | grep $WWW_PORT | grep "python"| cut -d":" -f2 | cut -d" " -f1`
if [[ $WWW_PORT -eq $stat ]]; then
sock=`netstat -tlpn | grep $WWW_PORT | grep "python"`
echo -e "Server is still running:\n$sock"
else
echo -e "Server has stopped"
fi

;;

status)
stat=`netstat -tlpn |grep $WWW_PORT| grep "python" | cut -d":" -f2 | cut -d" " -f1`
if [[ $WWW_PORT -eq $stat ]]; then
sock=`netstat -tlpn | grep $WWW_PORT | grep "python"`
echo -e "Server is running:\n$sock"
else
echo -e "Server is stopped"
fi
;;
*)
echo "Use $0 start|stop|status"
;;
esac
[/terminal]

 

Bash Command for SimpleHTTPServer

Bash Command for SimpleHTTPServer

3. After you finish editing the file, save it (Ctrl+o) and close it (Ctrl+x), then make sure the file has execution permissions by issuing the following command:

[terminal]
sudo chmod +x /usr/local/bin/http-server
[/terminal]

 

4. Finally, start and verify the status Python SimpleHTTPServer by issuing the below commands:

[terminal]
sudo http-server start
sudo http-server status
[/terminal]

 

start and verify SimpleHTTPServer

start and verify SimpleHTTPServer

 

5. To visit the server webpage open a browser and use the server’s IP Address and Port combination as below (replace IP Address accordingly):

http://192.168.1.210:8081

vist SimpleHTTPServer directory listing

vist SimpleHTTPServer directory listing

 

As you can see the SimpleHTTPServer doesn’t serve a webpage by default. It only creates a directory list of the path you supplied via the WWW_PATH variable, which in this case is /var/log/. You can now access and download all your log files via HTTP in case you want to do some system troubleshooting.

 

6. The http-server script configures the SimpleHTTPServer to write the log file at /tmp/nohup.log. In case you want to view SimpleHTTPServer log file issue the following command:

[terminal]
cat /tmp/nohup.log
[/terminal]

 

view SimpleHTTPServer log file

view SimpleHTTPServer log file

 

For real-time log file view run the following command:

[terminal]
tailf /tmp/nohup.log
[/terminal]

 

7. For stopping the SimpleHTTPServer just issue the following command:

[terminal]
sudo http-server stop
[/terminal]

 

stop SimpleHTTPServer

stop SimpleHTTPServer

 

 

STEP TWO – Change SimpleHTTPServer Port and Webroot Path and Serve HTML Static Files

8. Changing the Port and Path directives for SimpleHTTPServer is pretty simple. Just open http-server file for editing and change the WWW_PORT and WWW_PATH header variables with your own. By default SimpleHTTPServer can parse only HTML static files and automatically serve index.html files.

So, for the sake of demonstration, open /usr/local/bin/http-server file for editing and change the WWW_PATH variable path to serve HTML static files from /srv/ system path as illustrated in the below screenshot.

serve files from /srv path

serve files from /srv path

 

9. Then create a simple index HTML file on /srv/ path by issuing the following command:

[terminal]
sudo echo "<html><strong> Simple Pyhton HTTP Server</strong></html>" | sudo tee -a /srv/index.html
[/terminal]

 

10. In order to visit the default webpage served by SimpleHTTPServer, start the http-server and direct your browser at your machine IP:Port URL

[terminal]
sudo http-server start
[/terminal]

 

http://192.168.1.210:8081

SimpleHTTPServer default webpage

SimpleHTTPServer default webpage

 

 

STEP THREE – Enable http-server Sistem-Wide

11. In order to automatically start SimpleHTTPServer after every system reboot, open /etc/rc.local file with root privileges and add the following file before the last exit 0 statement:

[terminal]
sudo nano /etc/rc.local
[/terminal]

 

[terminal]
/usr/local/bin/http-server start
[/terminal]

 

Enable http-server system-wide

enable http-server system-wide

 

12. To assure that the rc.local script is enabled system-wide on Debian-based distributions, install the sysv-rc-conf package, then issue the following command:

[terminal]
sudo sysv-rc-conf rc.local on
[/terminal]

 

Using the http-server Bash script to handle Python SimpleHTTPServer can provide a simple and fast way through which you can turn any system directory into a web server directory and access almost every filesystem resource via HTTP without the need to install extra software on your system.

Leave a Reply