Anda di halaman 1dari 5

Ulasan CD | Klinik | Ulasan | Linux Ready | Utama | Bisnis | Feature | Tutorial TUTORIAL

Shell Script

Pemrograman Web
dengan Shell Script
Shell script tidak hanya dapat digunakan administrasi sistem.
Dengan beberapa baris kode shell script, Anda bahkan dapat
menghasilkan aplikasi web yang mengagumkan. Tidak perlu
instal macam-macam software, hanya Apache dan shell yang
menuruti standar POSIX saja yang diperlukan.

S
aat ini, bahasa pemrograman web bahkan dapat membuatnya dalam waktu memiliki permission executable. Secara
semakin menjamur dan semakin yang sangat singkat. default, akseslah aplikasi CGI Anda di
menjanjikan berbagai kemudahan alamat http://<HOST>/cgi-bin/
yang tidak pernah akan terbayang Aplikasi CGI <PROGRAM_ANDA>.
beberapa saat yang lalu. Sebut saja Pada dasarnya, apa yang akan kita buat Sebagai perbandingan, berikut ini
PHP. Bahasa yang satu ini, setidaknya adalah aplikasi CGI. Bicara teori, aplikasi adalah contoh aplikasi dalam beberapa
menurut penulis, sangat menyenangkan CGI dapat dibangun dengan bahasa bahasa.
untuk digunakan dalam pemrograman apapun juga, selama bahasa tersebut
web. Situs-situs web di dunia juga dapat menampilkan output. Dan boleh Bahasa C
banyak yang mengandalkan bahasa dikatakan, hampir semua bahasa #include <stdio.h>
yang satu ini. Belum lagi aplikasi- pemrograman tentunya dapat
aplikasi siap pakai lain yang dibuat menampilkan output. Dan apapun int main(void)
dengan PHP. bahasa favorit Anda, Anda dapat {
Web hosting pun tidak mau kalah. membuat aplikasi web dengan mudah. printf(“Content-type: text/plain”);
Dukungan PHP jarang sekali absen dalam Walau alangkah baiknya apabila bahasa printf(“\n\n”);
layanan mereka. Sebuah fenomena yang yang Anda gunakan memiliki fungsi printf(“Hello World”);
luar biasa. Anda tidak suka PHP? Baik. pemrosesan string yang cukup baik. Perl return 0;
Masih ada JSP. Penggemar Java akan atau Python adalah contoh yang baik }
berbahagia sekali dengan alat bantu yang dalam pemrosesan string. Shell script
satu ini. Kemudian, pengguna Python dengan tool-tool pendukung seperti awk Lakukanlah kompilasi dan akseslah
mungkin akan berbahagia dengan Zope, akan sangat membantu. lewat web browser Anda. Maka Anda
termasuk penulis. Secara umum, Anda perlu mencetak telah sukses membuat aplikasi CGI
Baiklah, sekarang coba kita simak header tertentu untuk dikenal sebagai dengan bahasa C.
beberapa hal berikut. Anda butuh untuk aplikasi CGI. Untuk menampilkan output
menampilkan informasi sistem via web dalam format hypertext, Anda akan Bahasa PERL
browser. Anda mungkin butuh untuk mencetak header berikut ini: #!/usr/bin/perl
menyimpan informasi pengunjung. Anda Content-type: text/html
mungkin perlu menampilkan isi berbagai <baris kosong> print “Content-type: text/plain”;
file di sistem via web browser. Atau print “\n\n”;
Anda ingin menyulap berbagai tool Sementara, untuk menampilkan print “Hello World”;
sistem menjadi aplikasi Internet. output berupa teks biasa, Anda akan
Lantas, apakah untuk tugas-tugas mencetak header berikut ini: - bahasa python
seperti itu, kita perlu menginstal PHP, Content-type: text/plain #!/usr/bin/python
atau menginstal JSP, atau menginstal <baris kosong>
Zope? Menggunakan PHP mungkin bisa print “Content-type: text/plain”
saja. Akan tetapi, kalau Anda sering Copy-kan program yang Anda buat print “\n”
berkutat dengan shell script, kenapa di direktori CGI Apache (umumnya print “Hello World”
tidak menggunakan shell script saja? direktori cgi-bin di instalasi Apache
Tidak ada software tambahan yang Anda. Untuk Debian, direktori CGI - shell script
perlu diinstal. Dan yang penting, untuk terletak di /usr/lib/cgi-bin). Jangan lupa #!/bin/sh
tugas-tugas tersebut di atas, Anda untuk memastikan program Anda

www.infolinux.web.id INFOLINUX SEPTEMBER 2003 61


TUTORIAL Ulasan CD | Klinik | Ulasan | Linux Ready | Utama | Bisnis | Feature | Tutorial
Shell Script



Informasi internal web server Program x2web

HTTP connection $HTTP_CONNECTION $HTTP_ACCEPT_CHARSET”


echo “Content-type: text/plain” HTTP host $HTTP_HOST echo “HTTP accept encoding:
echo HTTP keep alive $HTTP_KEEP_ALIVE $HTTP_ACCEPT_ENCODING”
echo “Hello World” HTTP user agent $HTTP_USER_AGENT echo “HTTP connection:
Path $PATH $HTTP_CONNECTION”
Dengan demikian, Anda dapat melihat Remote address $REMOTE_ADDR echo “HTTP host: $HTTP_HOST”
bahwa betapa menyenangkannya Remote port $REMOTE_PORT echo “HTTP keep alive:
melakukan pemrograman CGI, walau Script filename $SCRIPT_FILENAME $HTTP_KEEP_ALIVE”
untuk orang-orang yang hidup di Server address $SERVER_ADDR echo “HTTP user agent:
teknologi terkini, boleh jadi CGI akan Server admin $SERVER_ADMIN $HTTP_USER_AGENT”
ditertawakan. Server name $SERVER_NAME echo “Path: $PATH”
Server port $SERVER_PORT echo “Remote addr: $REMOTE_ADDR”
CGI dan informasi internal Server signature $SERVER_SIGNATURE echo “Remote port: $REMOTE_PORT”
web server Server software $SERVER_SOFTWARE echo “Script filename: $SCRIPT_FILENAME”
Dalam suatu aplikasi web, terkadang Unique id $UNIQUE_ID echo “Server addr: $SERVER_ADDR”
kita perlu mengetahui informasi- Gateway interface echo “Server admin: $SERVER_ADMIN”
informasi seperti browser apa yang $GATEWAY_INTERFACE echo “Server name: $SERVER_NAME”
digunakan oleh pengguna, dari alamat Server protocol $SERVER_PROTOCOL echo “Server port: $SERVER_PORT”
mana pengguna kita mengakses aplikasi Request method $REQUEST_METHOD echo “Server signature:
kita dan berbagai variabel penting Query string $QUERY_STRING $SERVER_SIGNATURE”
lainnya. Untuk itu, Anda tidak perlu Request URI $REQUEST_URI echo “Server software:
repot-repot. Web server akan Script name $SCRIPT_NAME $SERVER_SOFTWARE”
menyediakannya untuk Anda. echo “Unique id: $UNIQUE_ID”
Anda bisa mendapatkan informasi- Berikut ini adalah contoh program echo “Gateway interface:
informasi tertentu dengan mengakses untuk mendapatkan informasi-informasi $GATEWAY_INTERFACE”
variabel yang di-export oleh web server. tersebut: echo “Server protocol:
Cara lain untuk mendapatkan informasi- #!/bin/sh $SERVER_PROTOCOL”
informasi tersebut adalah mengambil echo “Request method:
hasil yang dikeluarkan oleh program echo “Content-type: text/plain” $REQUEST_METHOD”
env. Keluaran dari program env akan echo echo “Query string: $QUERY_STRING”
lebih rumit untuk dipecah-pecah. echo “Request URI: $REQUEST_URI”
Document root $DOCUMENT_ROOT echo “Greetings: Halo Superman !” echo “Script name: $SCRIPT_NAME”
HTTP accept $HTTP_ACCEPT echo echo
HTTP accept charset echo “Apache Environment:” echo “Sleeping time, superman !”
$HTTP_ACCEPT_CHARSET echo “Document root: $DOCUMENT_ROOT”
HTTP accept encoding echo “HTTP accept: $HTTP_ACCEPT” #Try to use echo ‘env‘. Looks more
$HTTP_ACCEPT_ENCODING echo “HTTP accept charset: complicated, but more informative !

62 INFOLINUX SEPTEMBER 2003 www.infolinux.web.id


Ulasan CD | Klinik | Ulasan | Linux Ready | Utama | Bisnis | Feature | Tutorial TUTORIAL
Shell Script

Informasi sistem df) df


Untuk kesempatan ini, keamanan sistem ;;
akan kita abaikan terlebih dahulu. psax) ps ax
Pernahkah Anda ingin melihat informasi ;;
ruang kosong penyimpanan Anda, daftar meminfo) cat /proc/meminfo
proses, informasi memori, informasi ;;
CPU, informasi partisi harddisk, informasi cpuinfo) cat /proc/cpuinfo
file sistem yang dimunt, informasi kernel, ;;
user-user dan group-group di sistem via part) cat /proc/partitions
web browser? Bagaimana kalau kita ;;
membuatnya sendiri? mtab) cat /etc/mtab
Sebutlah program yang akan kita buat ;;
ini dengan nama x2web. Program x2web uname) uname -a
ini memiliki kemampuan untuk ;;
menampilkan hal-hal yang telah userlist) sum=$(cat /etc/passwd
disebutkan sebelumnya via web browser. | wc -l)
Interface-nya akan ditampilkan cukup echo “found $sum
ramah dengan bantuan hyperlink. Dan users<hr>”
untuk mempermudah peng-copy-an, cat /etc/passwd | cut -d: -
x2web hanya akan memiliki satu file saja. f1
Untuk setiap tugas yang dikerjakan, ;;
kita akan memproses variabel grouplist) sum=$(cat /etc/group |
$QUERY_STRING. Apabila variabel wc -l)
yang satu ini belum diset, maka sebuah echo “found $sum
menu akan ditampilkan. Sementara groups<hr>”
apabila $QUERY_STRING memiliki nilai cat /etc/group | cut -d: -f1
tertentu, maka kita akan melakukan ;;
parsing sederhana dan melakukan tugas esac
yang bersesuaian. echo “</pre>”
Kita akan memiliki sebuah fungsi echo “<a
penting, yang kita beri nama wrapper(). href=$SCRIPT_NAME>back to menu</a>”
Fungsi ini akan melakukan parsing signature
$QUERY_STRING dan melakukan tugas }
yang bersesuaian. Fungsi lain seperti
fungsi signature() hanya akan menampilkan
informasi seputar web server. Berikut ini function signature()
adalah source code selengkapnya. {
Penjelasan akan diberikan setelahnya. echo “<hr>”
#!/bin/sh echo “$COPYRIGHT”
echo “$SERVER_SIGNATURE”
PROGNAME=”x2web” }
VERSION=”0.1a”
COPYRIGHT=”$PROGNAME $VERSION, (c) echo “Content-type: text/html”
Noprianto, July 2003. GPL.” echo
echo “<hr>”

function wrapper() if [ -z $QUERY_STRING ]


{
TASK=$(echo $QUERY_STRING | then
awk -F= ‘{print $2}’) echo “<body>”
echo “<a echo “<ul>”
href=$SCRIPT_NAME>back to menu</a>” echo “<li><a
echo “<pre>” href=$SCRIPT_NAME?task=df>disk free</
case $TASK in a></li>”

www.infolinux.web.id INFOLINUX SEPTEMBER 2003 63


TUTORIAL Ulasan CD | Klinik | Ulasan | Linux Ready | Utama | Bisnis | Feature | Tutorial
Shell Script



Program x2web sedang menampilkan daftar proses Statistik pengunjung

echo “<li><a then df) df


href=$SCRIPT_NAME?task=psax>process echo “<body>” ;;
list</a></li>” echo “<ul>” psax) ps ax
echo “<li><a echo “<li><a ;;
href=$SCRIPT_NAME?task=meminfo>Memory href=$SCRIPT_NAME?task=df>disk free</ meminfo) cat /proc/meminfo
information</a></li>” a></li>” ;;
echo “<li><a echo “<li><a cpuinfo) cat /proc/cpuinfo
href=$SCRIPT_NAME?task=cpuinfo>CPU href=$SCRIPT_NAME?task=psax>process ;;
information</a></li>” list</a></li>” ...
echo “<li><a ... ...
href=$SCRIPT_NAME?task=part>Partition ... ...
information</a></li>” ... grouplist) sum=$(cat /etc/group |
echo “<li><a echo “<li><a wc -l)
href=$SCRIPT_NAME?task=mtab>Mounted href=$SCRIPT_NAME?task=grouplist>All
filesystem</a></li>” groups in system</a></li>” echo “found $sum
echo “<li><a echo “</ul>” groups<hr>”
href=$SCRIPT_NAME?task=uname>Kernel signature cat /etc/group | cut -d: -f1
information</a></li>” echo “</body>” ;;
echo “<li><a esac
href=$SCRIPT_NAME?task=userlist>All else echo “</pre>”
users in system</a></li>” wrapper $QUERY_STRING echo “<a
echo “<li><a fi href=$SCRIPT_NAME>back to menu</a>”
href=$SCRIPT_NAME?task=grouplist>All signature
groups in system</a></li>” Blok kode ini bertugas untuk }
echo “</ul>” menampilkan menu apabila variabel
signature $QUERY_STRING belum diset. Kita Kita akan membahas fungsi wrapper()
echo “</body>” menggunakan penguji -z untuk tersebut. Pertama-tama, kita akan
mengetahui apakah suatu string adalah memroses $QUERY_STRING dengan
else string kosong atau tidak. memisahkannya menjadi dua bagian
wrapper $QUERY_STRING function wrapper() dengan token pemisah adalah tanda sama
fi { dengan (=). Untuk itu, kita meminta
TASK=$(echo $QUERY_STRING | bantuan kepada program awk. Setelah itu,
Bagaimana? Bukanlah source awk -F= ‘{print $2}’) apa yang kita lakukan hanyalah membaca
programnya pun cukup singkat dan echo “<a /proc ataupun file-file lain di sistem.
sederhana? href=$SCRIPT_NAME>back to menu</a>” Dengan demikian, kita dapat melihat
if [ -z $QUERY_STRING ] echo “<pre>” betapa mudahnya menampilkan informasi
case $TASK in sistem Anda ke web browser.

64 INFOLINUX SEPTEMBER 2003 www.infolinux.web.id


Ulasan CD | Klinik | Ulasan | Linux Ready | Utama | Bisnis | Feature | Tutorial TUTORIAL
Shell Script

Kembali ke masalah keamanan. #!/bin/sh stat) do_stat;;


Adalah sangat berbahaya apabila show) do_show;;
program ini Anda jalankan di lingkungan FSTAT=/tmp/stats esac
di mana setiap orang dapat dengan }
mudah mengaksesnya. Apakah Anda function do_stat()
rela apabila setiap orang mengetahui {
proses apa saja yang sedang berjalan test ! -f $FSTAT && touch $FSTAT echo “Content-type: text/html”
dan kemudian memanfaatkan kelemahan echo echo
salah satu dari program tersebut? Atau “$(date):::$REMOTE_ADDR:::$HTTP_USER_
relakah jika setiap orang mengintip setiap AGENT:::” >> $FSTAT
rahasia dapur Anda? Tidak. Pembuatan } if [ ! -z $QUERY_STRING ]
password bisa Anda gunakan. then
Selain itu, pembuatan direktori function do_show() wrapper $QUERY_STRING
terproteksi menggunakan .htaccess juga { fi
mungkin akan membantu. Namun, echo “<pre>”
apabila Anda ingin membuat administrasi sum=$(cat $FSTAT | wc -l 2>/dev/ exit 0
via web, pelajarilah prinsip kerja webmin. null)
echo “$sum records found” Bagaimana pendapat Anda tentang
Statistik pengunjung echo “<hr>” pemrograman CGI dengan shell script?
Mengetahui jumlah pengunjung situs kita test -f $FSTAT && cat $FSTAT | sed Apabila seseorang benar-benar
selalu menjadi hal yang menyenangkan. -e “s/:::/<br>/g” mendalami seni pemrograman shell,
Tentunya, setelah bercapai-capai ria echo “</pre>” maka aplikasi CGI yang berkualitas tinggi
membuat website, senyum lebar akan } pun dapat diciptakan. Hanya, aspek-
semakin merekah ketika semakin banyak aspek keamanan pun harus senantiasa
pengunjung yang menyibukkan web function wrapper() diperhatikan agar aplikasi tersebut tidak
server kita. Terkadang, kita perlu untuk { menjadi senjata makan tuan.
mencatat informasi pengunjung seperti case $1 in Noprianto (noprianto@infolinux.co.id)
tanggal dan waktu, alamat pengunjung
dan user agent yang digunakan. Dan
sekarang, bagaimana kalau kita
membuatnya sendiri?
Pertama-tama, apa yang perlu kita
lakukan adalah mendefinisikan file untuk
menampung semua informasi tersebut.
Tempatkan file tersebut di lokasi yang
cukup aman dan pastikan user yang
menjalankan Apache memiliki hak tulis di
lokasi tersebut. Di contoh kali ini, kita
akan menyimpannya di /tmp. Setelah itu,
kita perlu pula memastikan token yang
kita gunakan untuk memisahkan setiap
field informasi yang kita simpan. Contoh
ini akan menggunakan field ::: (tiga buah
titik dua) sebagai pemisah.
Prinsip kerjanya sangatlah sederhana.
Script akan membaca $QUERY_STRING
dan menentukan tugas apa yang akan
dikerjakan. Apabila $QUERY_STRING
bernilai stat, maka kita akan menulis ke
dalam ‘database’. Sementara, apabila
$QUERY_STRING adalah show, maka
kita akan menampilkan semua isinya ke
web browser. Berikut ini adalah source
code selengkapnya.

www.infolinux.web.id INFOLINUX SEPTEMBER 2003 65

Anda mungkin juga menyukai