A Bash web server
Bash Web Server with Raspberry Pi GPIO
For many Raspberry Pi projects, monitoring the status of the General Purpose Input/Output (GPIO) pins is quite important.
The Raspberry Pi gpio
utility is a command-line tool that can be used to read and write to GPIO pins. The readall
option can be used to show the present status of all the GPIO pins.
Rather than passing the Bash commands as a string, an alternative approach is to use a Bash script and then call (sh
) that file. An example script file (web_body.sh
) that shows the time and then calls the gpio readall
command would be:
#!/bin/bash # web_body.sh - Show the time and # PI GPIO pins date $T echo "$(gpio readall)"
To run this script file in a Bash web server, use the following command:
while true; do { \ echo -ne "HTTP/1.1 200 OK\r\n"; \ sh web_body.sh; } \ | nc -l -k -q 2 8080; \ done
Figure 3 shows the web page with the GPIO pins' time and the status.
Send GPIO Writes from the Address Bar
Client-side GET
requests can be simulated on the browser address bar. For example, entering
gpio write 7 1
in the address bar sends that string to the Bash Server as a GET
request.
In Figure 4, you can see that the HTTP request uses HTML encoding. In this example, a space is converted to %20
.
Bash code can be added to look for specific messages. In this case, you can search for the "gpio write 7 1"
or "gpio write 7 0"
messages. If found, the code then executes the extracted message.
The Bash web server code now is modified to look for the "GET gpio"
message and then decode any HTTP %20
characters to spaces. Next, the code parses out the string to get the GPIO message and finally executes the required command:
while true; do { echo -ne "HTTP/1.1 200 OK\r\n"; \ sh web_body.sh; } | \ nc -l -k -q 5 8080 | \ grep "GET /gpio" | \ sed -e 's/%20/ /g' | \ eval $( awk '{print substr($0,6,15) }') ; done
With the new code, the "gpio write" text entered in the address bar is executed, and the result can be seen in the web page (Figure 5).
Create an HTML Form
Entering commands on the command line works, but it's crude. A better way is to create an HTML Form.
The Bash web server code can remain exactly the same as in the earlier example. The original script (web_body.sh
) file can be modified to output in HTML format, and three forms can be included (Listing 2). The first and second forms will define the GET
actions to turn the GPIO pin on or off, and the third form will be used to refresh the page to check for GPIO changes. Figure 6 shows the client web page with buttons to turn on and off a GPIO pin. After toggling the GPIO pin, a refresh of the web page is required to see the new status.
Listing 2
Toggling a Rasp Pi GPIO Pin
#!/bin/bash # web_body.sh - Show the time and PI GPIO pins # - Use HTML instead of text output # - Add forms for GPIO on/off, and a refresh echo " <!DOCTYPE html><html><head> </head><body> <h1>Bash Commands in a Web Page</h1> <h2>Toggle Pin 7 On/Off</h2> <form action='gpio write 7 0'> <input type='submit' value='OFF'> </form> <form action='gpio write 7 1'> <input type='submit' value='ON'> </form> <form action=''> <input type='submit' value='Refresh Page'> </form> <pre> " date $T echo "$(gpio readall)" echo "</pre></body></html>"
The nc
utility is extremely powerful, but it can be rather dangerous in that it can create back doors into your system. In this example, the code was specifically looking for the string "GET /gpio"
. This allows only gpio
commands to be passed. However, if the code only looked for "GET /"
, then you could potentially pass any command string to your server.
« Previous 1 2 3 Next »
Buy this article as PDF
(incl. VAT)
Buy Linux Magazine
Subscribe to our Linux Newsletters
Find Linux and Open Source Jobs
Subscribe to our ADMIN Newsletters
Support Our Work
Linux Magazine content is made possible with support from readers like you. Please consider contributing when you’ve found an article to be beneficial.
News
-
Fedora 41 Beta Available with Some Interesting Additions
If you're a Fedora fan, you'll be excited to hear the beta version of the latest release is now available for testing and includes plenty of updates.
-
AlmaLinux Unveils New Hardware Certification Process
The AlmaLinux Hardware Certification Program run by the Certification Special Interest Group (SIG) aims to ensure seamless compatibility between AlmaLinux and a wide range of hardware configurations.
-
Wind River Introduces eLxr Pro Linux Solution
eLxr Pro offers an end-to-end Linux solution backed by expert commercial support.
-
Juno Tab 3 Launches with Ubuntu 24.04
Anyone looking for a full-blown Linux tablet need look no further. Juno has released the Tab 3.
-
New KDE Slimbook Plasma Available for Preorder
Powered by an AMD Ryzen CPU, the latest KDE Slimbook laptop is powerful enough for local AI tasks.
-
Rhino Linux Announces Latest "Quick Update"
If you prefer your Linux distribution to be of the rolling type, Rhino Linux delivers a beautiful and reliable experience.
-
Plasma Desktop Will Soon Ask for Donations
The next iteration of Plasma has reached the soft feature freeze for the 6.2 version and includes a feature that could be divisive.
-
Linux Market Share Hits New High
For the first time, the Linux market share has reached a new high for desktops, and the trend looks like it will continue.
-
LibreOffice 24.8 Delivers New Features
LibreOffice is often considered the de facto standard office suite for the Linux operating system.
-
Deepin 23 Offers Wayland Support and New AI Tool
Deepin has been considered one of the most beautiful desktop operating systems for a long time and the arrival of version 23 has bolstered that reputation.