Qualche volta può essere utile mostrare con un semplice CGI il contenuto di una directory, o eseguire un comando con qualche parametro.
Se sieet dei programmatori avrete sicuramente in mente soluzioni eleganti e pratiche in Java, Ruby o PHP; ma per un amministratore di sistema può essere comodo fare un semplice programma bash, linguaggio che utilizza tutti i giorni.
Vediamo come utilizzare la bash che usiamo di solito sul terminale in un programma CGI.
Tutti questi esempi devono essere messi in un file con il permesso di esecuzione (eseguibile dal webserver) e messo nella directory CGI, in Apache questa è la directory indicare con la direttiva ScriptAlias .
Cgi Base
Una cosa importante da ricordare è che bisogna identificare il MIME type della pagina, ovvero il tipo di dati che vogliamo trasmettere ad esempio potrebbero essere text/plain text/html o application/xml.
Altrimenti avremo un errore del webserver con un messaggio del tipo “Malformed header”
#!/bin/bash echo "Content-Type: text/plain" echo echo "Today is:" date |
Il MIME è identificato con i primi due echo, il primo imposta il content-type ed il secondo manda una linea vuota, necessaria per far interpretare correttamente il content-type.
Stesso esempio ma in html:
#!/bin/bash echo "Content-Type: text/html" echo echo "<HTML><BODY>" echo "<CENTER>Today is:</CENTER>" echo "<CENTER><B>" date echo "</B></CENTER>" echo "</BODY></HTML>"
Ottenere dei parametri dai metodi GET e POST
Il modo più semplice per ottenere dei parametri per il vostro semplice CGI è quello di utilizzare i metodi GET o POST, e di analizzarli con bashlib
bashlib è uno script shell che rende la programmazione CGI con la bash shell più facile, o almeno più tollerabile. Esso contiene alcune funzioni che vengono chiamate automaticamente e configurano gli elementi dei form (dalle POST e GET) e cookie nel proprio ambiente. Contiene anche una documentazione completa su come usare queste variabili e su come impostare i cookie manualmente.
Con bashlib per ottenere uno specifico parametro scrivete:
... YourVariable=`param username` ... |
Quindi se il vostro CGI è chiamato con la url:: http://yourserver.com/bash.cgi?name=joe&surname=smith potete usare il seguente codice per ottenere i due parametri.
#!/bin/bash # this sources bashlib into your current environment . /usr/local/lib/bashlib echo "Content-type: text/plain" echo "" name=`param name` # name = joe surname=`param surname` # surname = smith echo "Hello $name $surname"
Esempio con le bashlib
#!/bin/bash # this sources bashlib into your current environment . /usr/local/lib/bashlib echo "Content-type: text/html" echo "" # OK, so we've sent the header... now send some content echo "<html><title>Crack This Server</title><body>" # print a "hello" if the username is filled out username=`param username` if [ -n "x$username" != "x" ] ; then echo "<h1>Hello, $username</h1> fi echo "<h2>Users on `/bin/hostname`</h2>" echo "<ul>" # for each user in the passwd file, print their login and full name # bold them if they are the current user for user in $(cat /etc/passwd | awk -F: '{print $1 "\t" $5}') ; do echo "<li>" if [ "$username" = "$user" ] ; then echo "<strong>$user</strong>" else echo "$user" fi echo "</li>" done echo "</ul>" echo "</body></html>"
E se pensate che con la bash si possano fare solo piccole cose, guardate questo progetto: http://nanoblogger.sourceforge.net/
Riferimenti:
Bash Libraries
http://bashlib.sourceforge.net/
Bash CGI Reference Material
http://www.yolinux.com/TUTORIALS/LinuxTutorialCgiShellScript.html
http://www.ffnn.nl/pages/articles/linux/cgi-scripting-tips-for-bash-or-sh.php
http://www.acmesystems.it/?id=165
http://wiki.flexion.org/BashCGI.html
Popular Posts:
- None Found
Very cool, though I’ll need to do some more test for security sake (doesn’t seem to allow pipes, semicolons or characters to be executed even when used in grep and cat, so it look *pretty* secure.
I did notice 2 errors though
1) The semicolon on line 15 (echo Hello user) should be a quotation mark
2) If you want the browser to INTERPRET the html (instead of just displaying it), replace < with .
gah, comment thing ate my characters:
Very cool, though I’ll need to do some more test for security sake (doesn’t seem to allow pipes, semicolons or <, > characters to be executed even when used in grep and cat, so it look *pretty* secure.
I did notice 2 errors though
1) The semicolon on line 15 (echo Hello user) should be a quotation mark
2) If you want the browser to INTERPRET the html (instead of just displaying it), replace < with < and > with >
Excellent intro!
Thank you,
Ricky
The article might have been comprehensible to me if, someplace (near the beginning??), the author had spelled out or explained what CGI means.
Funny! This churns up many memories.
More than 15 years ago I was writing bash CGI scripts, storing data in little chunks in the filesystem. Didn’t have PHP and MySQL back then.
Long before bashlib, there was uncgi, a C program that turned GET/POST into environment variables that were handed to bash:
http://www.midwinter.com/~koreth/uncgi.html
Actually, since I was doing this on a Sun SPARC-20, I suspect it was ancient /bin/sh Bourne Shell, not bash. Or ksh or csh. Whatever was on the machine. It didn’t even have Perl.
I wrote a “caption contest” and, long before anybody used the word “blog,” a web log tool for Minneapolis weatherman Paul Douglas to update his online weather column for startribune.com.
For a contest, Garrison Keillor wrote a short story with gaping holes that I turned into a madlibs-like Web form.
Keillor faxed in his story about three hours before the deadline, but I was able get it online in time. If I ever meet Steven Grimm (author of uncgi) I owe him a beer.
Linux Scanner Server is based on a shell script and CGI:
http://scannerserver.online02.com
When I discovered that it used shell scripting I fixed several bugs and released a patch for it:
http://jhansonxi.blogspot.com/2010/10/patch-for-li nux-scanner-server-v12.html
Shell scripting has its uses but using it for text handling is annoying.
LSS is using sh (Dash on Ubuntu).