Tips en Trucs 2012

Bash CGI scripts op de webserver

Soms heb je een eenvoudige CGI nodig om de inhoud van een map te tonen of om een opdracht met wat argumenten uit te voeren. Als programmeur kun je wellicht een elegantere oplossing bedenken in Java, Ruby of PHP, maar voor een systeembeheerder is een eenvoudig bash script misschien eenvoudiger (systeembeheerders gebruiken bash immers dagelijks). M.a.w. hoe gebruiken we een bash script als CGI programma (CGI programma's geven de uitvoer door aan een webserver die het op zijn beurt doorgeeft aan een browser op een andere computer).

Om CGI bash scripts te testen of er kennis mee te maken kan je gebruik maken van een testserver, bijvoorbeeld de kant en klare webserver voor scholen op deze site op deze pagina.

Alle scripts moet je met uitvoerrechten (voor de webserver) opslaan in de CGI map van de webserver. Bij Apache wordt deze bepaald door de instelling ScriptAlias.

Om bash scripts te kunnen schrijven moet je toegang hebben tot de webserver. De testserver is na de start via SSH bereikbaar. Met een terminal editor zoals joe kan je dan Bash scripts schrijven.

Eenvoudige Bash CGI scripts

Eén van de zaken die je niet over het hoofd mag zien is dat je een MIME-type moet opgeven, dit bepaalt het gegevenstype dat je via de webserver wilt versturen. Voor een gewone HTML pagina gebruik je het MIME-type text/html. Bij het niet of foutief opgeven van een MIME-type zie je in de browser enkel een foutmelding.

Het MIME-type wordt met twee echo opdrachten doorgegeven. De eerste echo opdracht bevat het Content-Type en de tweede echo opdracht is enkel nodig voor het aanmaken van een lege regel. Deze lege regel is verplicht, indien je geen extra lege regel aanmaakt, krijg je een foutmelding in de browser.

Een voorbeeld (op de testserver: /srv/www/cgi-bin/html.sh):
#!/bin/bash
echo "Content-Type: text/html"
echo
echo "<html>"
echo "<body>"
echo "<center>Vandaag:</center>"
echo "<center><b>"
date
echo "</b></center>"
echo "</body>"
echo "</html>"

Na het schrijven en het opslaan van het script geef je het script uitvoerrechten met de opdracht:
chmod +x /srv/www/cgi-bin/html.sh

Argumenten ophalen met de GET en POST methode

De eenvoudigste manier om argumenten op te halen is gebruik te maken van de bashlib bibliotheek. Bashlib is een script om het schrijven van CGI scripts met Bash te vereenvoudigen, Het bevat een aantal functies die automatisch worden uitgevoerd om formulierelementen (van POST en GET) en cookies in de bash omgeving op te nemen. De documentatie voor het werken met het script zit in het script zelf.

Om een specifiek argument op te vragen gebruik je de opdracht:
Variabele=`param naam`

Een CGI script om de twee argumenten in het adres http://192.168.1.5/cgi-bin/bash?naam=Pinoy&voornaam=Dany weer te geven wordt:
#!/bin/bash
# activeer bashlib
. bashlib/bashlib
echo "Content-type: text/plain"
echo ""
naam=`param naam` # naam = Pinoy
voornaam=`param voornaam` # voornaam = Dany
echo "Hallo $voornaam $naam"
Een tweede uitgebreider voorbeeld:
#!/bin/bash

# activeer bashlib
. bashlib/bashlib

echo "Content-type: text/html"
echo ""

# OK, de header is verzonden... nu de inhoud
echo "<html><title>Gebruikers op deze webserver</title><body>"

# Welkom indien een username werd opgegeven
username=`param username`
if [ "$username" != "" ] ; then
    echo "<h1>Hallo, $username</h1>"
fi

echo "<h2>Gebruikers op `/bin/hostname`</h2>"
echo "<ul>"

# voor elke gebruiker in het bestand passwd wordt de login en volledige naam weergegeven
# de opgegeven username wordt vet weergegeven
for user in $(sed 's/[\t ]/_/g' /etc/passwd | awk -F: '{print $1}') ; do
    fullname=`getent passwd $user | cut -d ':' -f 5`
    echo "<li>"
    if [ "$username" = "$user" ] ; then
        echo "<strong>$user: $fullname</strong>"
    else
        echo "$user: $fullname"
    fi
    echo "</li>"
done
echo "</ul>"
echo "</body></html>"

Tot hier de kennismaking met Bash CGI scripts. Mocht je denken dat alleen kleine CGI taken met Bash mogelijk zijn, kijk dan even naar nanoblogger.

Wie meer wil weten over het onderwerp kan terecht bij:
Linux Tutorials: CGI Shell scripts
Forever For Now - CGI Scripting Tips for Bash or SH