+ All Categories
Home > Documents > Anto Shell Scripting

Anto Shell Scripting

Date post: 27-Jun-2015
Category:
Upload: havezd
View: 154 times
Download: 3 times
Share this document with a friend
Popular Tags:
36
i BROUGHT TO YOU BY: ATIK PILIHANTO Presented in PT. Datacomm Diangraha
Transcript
Page 1: Anto Shell Scripting

i

BROUGHT TO YOU BY:

ATIK PILIHANTONetwork & Security Consultant

Presented in PT. Datacomm Diangraha

Page 2: Anto Shell Scripting

ii

Table of Content

1. Basic Shell Scripting

a. Redirections & Pipesi. Redirectionsii. Pipes

b. Variables

c. Conditional & Looping Statementsi. Conditional if .. thenii. Conditional if .. then .. else

iii. Conditional switch .. caseiv. Looping forv. Looping whilevi. Looping until

d. Introduction Bash I/O Scriptingi. Using readii. Using command line argument

e. Arithmetic & Strings Operationsi. Arithmetic Operationsii. Strings Operations

2. Advanced Shell Scripting

a. Array

b. Regular Expressioni. Grepii. Awk

iii. Sed

c. System Administrative Command Scripting

d. Aliases

e. Functions

f. I/O Redirections

g. Using /dev & /proci. Using /devii. Using /proc

h. Security Issues

i. Code Poetry

3. Shell Scripting in Practice

a. Creating & Scheduling Automatic Backup

b. Creating & Scheduling Automatic File Integrity Checker

c. DomainToIP Enumeration Script

Presented in PT. Datacomm Diangraha

Page 3: Anto Shell Scripting

iii

d. Start & Stop GRE Tunneling Script

e. Automatic Default Routing Switcher Script

f. Start & Stop Firewall Script

g. Start & Stop Bandwith Management Script

h. Datacomm needs?? Q&A

Presented in PT. Datacomm Diangraha

Page 4: Anto Shell Scripting

iv

1. Basic Shell Scripting

A. Redirections & Pipes

I. Redirections

Ada 3 file deskriptor standar pada shell yaitu : stdin, stdout, dan stderr. Bilangan 1

merepresentasikan stdout sedangkan 2 merepresentasikan stderr. Proses redireksi bisa dilakukan

dengan:

Redireksi stdout ke file, semua perintah pada shell dikirim ke stdout selama tidak memiliki error.

Ketika kita mengetikkan perintah ls –al pada layar muncul hasil perintah tersebut. Jika kita

menginginkan hasil perintah tersebut disimpan ke file bisa dilakukan dengan:

Redireksi stderr ke file, jika terjadi error semua perintah pada shell dikirim ke stderr, misalnya

user biasa hendak melihat isi file /etc/shadow maka akan muncul error Permission denied. Jika

kita menginginkan perintah tersebut disimpan ke file dilakukan dengan:

cat /etc/shadow 2>denied.txt

Redireksi stdout ke stderr, proses redireksi dari stdout ke stderr dilakukan dengan:

ls –al 1>&2

Redireksi stderr ke stdout, proses redireksi dari stderr ke stdout dilakukan dengan:

ls –al 2>&1

II. Pipes

Pipes dapat digunakan agar output sebuah perintah shell menjadi input dari perintah shell yang

lain. Misalnya kita ingin mencari user anto pada file /etc/passwd bisa dilakukan dengan:

cat /etc/passwd|grep anto

Pipes sangat bermanfaat ketika dikombinasikan dengan perintah shell linux terkait dengan

regular expression.

Presented in PT. Datacomm Diangraha

ls –al > ls-al.txt

Page 5: Anto Shell Scripting

v

B. Variables

Variables pada sh/bash tidak perlu dideklarasikan, cukup inputkan sebuah nilai pada variable

dan panggilah variable tersebut dengan diawali tanda $. Contoh definisi variable sederhana adalah

sebagai berikut:

#!/bin/bashNAME = “anto” #Variable NAMEAGE = 23 #Variable AGEecho Nama saya $NAME umur $AGE

Pada sh/bash ada beberapa built-in dan spesial variable, built-in dan sepsial variable tersebut

adalah:

Envoronment variable, adalah variable yang pendefinisiannya berpengaruh pada shell dan user

interface, contoh variable ini adalah SHELL, USER,PATH,UID, dan PS1

Positional parameters variable, adalah variable yang mendefinisikan argumen yang dilewatkan

pada sebuah script, contohnya:

#!/bin/bash# eksekusi dengan ./script <val1> <val2>echo val1 = $1echo val2 = $2echo $@echo length = $##EOF

$@ merupakan variable yang berisi semua value pada positional parameters dan $#

menunjukkan jumlah parameters yang diinputkan.

Local variable, adalah variable yang hanya dikenal pada blok fungsi tertentu. Pembahasan local

variable pada pembahasan “Functions”.

Exit status variable dinotasikan dengan $?.

PID variable dinotasikan dengan $$.

C. Conditional & Looping Statements

Conditional variable digunakan untuk menentukan pilihan statement dari kondisi bersyarat,

sedangkan looping berguna dalam pembuatan statement yang butuh perulangan menjadi lebih efektif.

Beberapa conditional statement dan looping adalah:

Presented in PT. Datacomm Diangraha

Page 6: Anto Shell Scripting

vi

I. Conditional if .. then

Jika persaratan pada blok if dipenuhi maka pernyataan setelah then dieksekusi. Contoh

conditional if .. then sebagai berikut :

#!/bin/bash# eksekusi dengan ./script <j|other>if [ $# -ne 1 ]then echo "Usage : ./if-then.sh <j|other>"; exit;fiif [ "$1" == "j" ]then echo Jakarta is capital city;fi#EOF

Antara if dan kurung siku [ dipisahkan oleh spasi, kurung siku [ dan “$1” dipisahkan oleh spasi,

“$1” dan == dipisahkan oleh spasi, == dan “j” dipisahkan oleh spasi, “j” dan kurung siku ] juga dipisahkan

oleh spasi. Statement if .. then diakhiri dengan fi.

II. Conditional if .. then .. else

Jika persaratan pada blok if dipenuhi maka pernyataan setelah then dieksekusi, jika tidak maka

pernyataan setelah else yang dieksekusi. Contoh conditional if .. then .. else sebagai berikut:

#!/bin/bash# eksekusi dengan ./script <100|other>if [ $# -ne 1 ]then echo "Usage : ./if-then-else.sh <100|other>"; exit;fiif [ “$1” -eq 100 ]then echo Anda menginputkan angka 100else echo Anda menginputkan angka yang lainfi#EOF

Antara if dan kurung siku [ dipisahkan oleh spasi, kurung siku [ dan “$1” dipisahkan oleh spasi,

“$1” dan == dipisahkan oleh spasi, == dan “100” dipisahkan oleh spasi, “100” dan kurung siku ] juga

dipisahkan oleh spasi. Statement if .. then .. else diakhiri dengan fi.

III. Conditional case .. esac

Presented in PT. Datacomm Diangraha

Page 7: Anto Shell Scripting

vii

Pada conditional statement yang memiliki banyak persyaratan, conditional switch .. case

digunakan. Contoh penggunaan conditional case .. esac adalah:

#!/bin/bash# eksekusi dengan ./script <a|b|c|d|other>if [ $# -ne 1 ]then echo "Usage : ./switch-case.sh <a|b|c|other>"; exit;fi

case "$1" in "a") echo "anda menekan a" ;; "b") echo "anda menekan b" ;; "c") echo "anda menakan c" ;; *) echo "anda menekan yang lain" ;;Esac#EOF

Antara case dan “$1” dipisahkan oleh spasi dan antara “$1” dan in juga dipisahkan oleh spasi.

Setiap opsi pada case diakhiri dengan ;;. Statement case diakhiri dengan esac.

IV. Loop for

Contoh kode berikut akan melakukan ping ke semua host yang ada dalam LIST menggunakan

looping for.

#!/bin/bashLIST="10.1.1.1 172.16.254.4 10.1.1.10"for HOST in $LISTdo ping -c 2 $HOSTdone

Setelah sarat iterasi pada for, do digunakan untuk memulai eksekusi setiap proses atau

statement dalam loop. Jika semua iterasi telah selesai dieksekusi, done mengakhiri proses looping.

Presented in PT. Datacomm Diangraha

Page 8: Anto Shell Scripting

viii

V. Loop while

Contoh kode berikut akan melakukan ping ke semua host antara alamat IP 10.1.1.1 s.d 10.1.1.10

menggunakan looping while.

#!/bin/bashLASTBIT=1while [ $LASTBIT –le 10 ];do ping –c 1 10.1.1.$LASTBIT let LASTBIT++;done

While dan kurung siku [ dipisahkan oleh spasi. Semua yang berada dalam kurung siku dipisahkan

satu sama lain oleh spasi. Setelah sarat iterasi while dalam tanda kurung siku, do digunakan untuk

memulai eksekusi setiap proses atau statement dalam loop. Jika semua iterasi telah selesai dieksekusi,

done mengakhiri proses looping.

VI. Loop until

Contoh kode berikut akan melakukan ping ke semua host antara alamat 10.1.1.1 s.d 10.1.1.10

menggunakan looping until.

#!/bin/bashLASTBIT=1until [ $LASTBIT –gt 10 ];do ping –c 1 10.1.1.$LASTBIT let LASTBIT++;done

Until dan kurung siku [ dipisahkan oleh spasi. Semua yang berada dalam kurung siku dipisahkan

satu sama lain oleh spasi. Setelah sarat iterasi until dalam tanda kurung siku, do digunakan untuk

memulai eksekusi setiap proses atau statement dalam loop. Jika semua iterasi telah selesai dieksekusi,

done mengakhiri proses looping.

Presented in PT. Datacomm Diangraha

Page 9: Anto Shell Scripting

ix

D. Introduction Bash I/O Scripting

I/O disini berupa input output dari user secara umum, tidak hanya membahas I/O sistem operasi

saja. I/O dari user bisa berupa string, file, ataupun yang lain sebagai input dan output script bash.

I. Using Read

Read digunakan untuk membaca inputan user dari sebuah prompt inputan, contoh

menggunakan read adalah:

#!/bin/bashecho -n "masukan sebuah file : "read MYFILE;cat $MYFILEecho "File yang anda masukkan adalah $MYFILE"

II. Using Command Line Argument

Penggunaan command line argument adalah implementasi positional parameters, positional

parameters sangat umum digunakan sebagai input programs. Pembahasan I/O lebih mendalam pada

Advanced Shell Scripting.

E. Arithmetic & Strings Operations

I. Aritmetic Operations

Operasi aritmetic melibatkan operator aritmetic yang berperan dalam operasi bilangan dan

operator relational aritmetic yang berperan dalam operasi perbandingan bilangan, operator-operator

tersebut adalah:

+ operator penjumlahan

- operator pengurangan

* operator perkalian

/ operator pembagian

-lt operator less than

-gt operator great than

-le operator less/equal than

-ge operator great/equal than

Presented in PT. Datacomm Diangraha

Page 10: Anto Shell Scripting

x

-eq operator equal

-ne operator not equal

Contoh script bash yang melibatkan operasi artitmetic adalah :

#!/bin/bashA=100;B=200;if [ $B –gt $A ]then echo $(($A+$B))fi

II. Strings Operations

Operasi strings melibatkan operator pembanding strings yang berperan dalam

perbandingan sebuah string dengan string yang lain. Operator-operator itu meliputi:

S1=S2 strings matches

S1!=S2 strings doesn’t match

-n S1 strings is not null

-z S1 strings is null

Contoh bash script sederhana yang melibatkan perbandingan strings adalah:

#!/bin/bashSTR1="AO"STR2="AO"

if [ $STR1 = $STR2 ]then echo Strings matches;else echo Strings does not match;fi

if [ -z $STR1 ]then echo String STR1 is null;else echo String STR1 is not null;fi

Presented in PT. Datacomm Diangraha

Page 11: Anto Shell Scripting

xi

2. Advanced Shell Scripting

A. Array

Array adalah penyusunan sistematik object object, biasanya dalam baris dan kolom. Bash versi

terbaru mendukung array dimensi satu yang bisa digunakan untuk menyusun object dalam bentuk array

baris. Contoh penggunaan sederhana array adalah:

#!/bin/bashVAR=( senin selasa rabu kamis jumat sabtu minggu )echo Length array : ${#VAR[@]}echo Isi array : ${VAR[@]}echo Komponen array pertama : ${VAR[0]}echo Komponen array terakhir : ${VAR[6]}echo Length komponen terakhir : ${#VAR[6]}

Contoh operasi array untuk keperluan pendeteksian up/down-nya host dijaringan:

#!/bin/bashLHOST=( 10.1.1.1 10.1.1.3 10.1.1.5 10.1.1.7 10.1.1.9 )COUNT=0for HOST in ${LHOST[@]}do ping -c 2 $HOST > /dev/null 2>&1 if [ $? -eq 0 ] then echo $HOST is alive let COUNT++ fidoneecho Scanned Host : ${#LHOST[@]} - Found $COUNT host alive

Penggunaan array bisa dikombinasikan dengan berbagai operasi bash scripting, sebagai

contohnya kode di atas array dikombinasikan dengan conditional if. Jika sebuah shell command sukses

dieksekusi maka akan memberikan variable exit status ($?) bernilai 0.

B. Regular Expression

I. Grep

Grep merupakan salah satu tools regular expresession (regex) pada shell linux. Dengan

menguasai grep akan sangat mendukung penguasaan pada tools regex lain seperti awk dan sed.

Presented in PT. Datacomm Diangraha

Page 12: Anto Shell Scripting

xii

Dengan menggunakan grep kita bisa mencari lines yang memiliki kriteria sesuai dengan

ketentuan kita. Contoh penggunaan grep:

cat namafile |grep anto menemukan baris yang mengandung kata anto

cat namafile |grep [Aa]nto menemukan baris yang mengandung kata anto dan Anto

cat namafile |grep ^[Aa] menemukan baris yang dimulai dengan A atau a.

cat namafile|grep bash$ menemukan baris yang diakhiri dengan bash.

Pada regular expression dengan grep ada beberapa karakter spesial yaitu:

^foo dimulai dengan foo

foo$ diakhiri dengan foo

. match any characters

* perulangan satu atau beberapa kali

II. Awk

Awk merupakan tool untuk keperluan text-processing yang digunakan untuk regex dengan

tingkat yang lebih kompleks dari grep. Sintaks umum awk adalah awk ‘/search pattern/’ {program

action} . Karakter spesial yang ada pada grep juga berlaku pada awk. Contoh penggunaan awk:

#!/bin/bash#awk.sh

RESOLVFILE=/etc/resolv.conf

if [ ! -e $RESOLVFILE ]then echo "File DNS resolver is not exist" exitfi

PRIMARY=$(awk '{print $2}' < $RESOLVFILE|head -1)echo "Primary DNS resolver is $PRIMARY"

Pada bagian selanjutnya, awk menjadi tools yang sering digunakan untuk keperluan regular

expression.

Presented in PT. Datacomm Diangraha

Page 13: Anto Shell Scripting

xiii

III. Sed

Sed merupakan tools editing files melalui commandline dengan memanfaatkan regular

expression. Sed memiliki beberapa command, tetapi yang paling essential adalah kemampuan

untuk melakukan subtitute. Beberapa command sed:

Subtitute menggunakan s.

Delete menggunakan d.

Print menggunakan p.

Multiple command dengan –e.

Contoh penggunaan sed untuk mengetahui semua authority name server dari sebuah

domain adalah:

#!/bin/bash#authns.sh

if [ -z $1 ]then echo "Usage : ./authns.sh <domain>" exit;fi

echo "All authority name server for $1 :"dig $1 -t any|sed -e '/A\|;\|^$\|MX\|TXT\|SOA/d'|awk '{print $5}'exit $?

C. System Administrative Command Scripting

Yang dimaksud dengan system administrative command disini adalah perintah sistem operasi

yang berguna untuk memodifikasi konfigurasi sistem. Untuk keperluan modifikasi konfigurasi sistem

maka user root dibutuhkan. Untuk itu perlu dilakukan pengecekan bahwa script dijalankan oleh root

sebelum bagian administrative command dieksekusi. Berikut ini contoh penggunaan shell script untuk

konfigurasi jaringan:

Presented in PT. Datacomm Diangraha

Page 14: Anto Shell Scripting

xiv

#!/bin/bash# Only root can run this script!

IPADDR="192.168.2.100"NETMASK="255.255.255.0"IFACE="eth0"GATEWAY="192.168.2.1"UIDROOT=0

if [ $UID -ne $UIDROOT ]then echo "Only root can run this script!" exitfi

if [ -z $1 ]then echo "usage : ./network.sh <-start|-stop>" exitfi

case "$1" in "-start") ifconfig $IFACE $IPADDR netmask $NETMASK up route add default gw $GATEWAY ;; "-stop") ifconfig $IFACE down ;; *) echo "ERR : wrong parameters!" ;;esac

Dengan bantuan shell script di atas proses konfigurasi jaringan pada suatu interface bisa

dikerjakan dalam waktu yang lebih singkat.

D. Aliases

Aliases bekerja semacam keyboard shortcut, alias berguna untuk menyingkat beberapa perintah

shell linux menjadi perintah yang lebih pendek. Contoh penggunaan alias adalah sebagai berikut:

Presented in PT. Datacomm Diangraha

Page 15: Anto Shell Scripting

xv

#!/bin/bash# alias.sh

shopt -s expand_aliases

#Set alias llalias ll='ls -l'll /home#unset aliasunalias ll

Dengan menggunakan alias bisa diketahui bahwa ll adalah shortcut untuk mengetikkan ls –al.

E. Functions

Fungsi adalah sekumpulan blok instruksi yang bertujuan untuk meyelesaikan tugas tertentu.

Fungsi sering digunakan ketika ada sekelompok instruksi yang sifatnya berulang. Contoh pemanfaatan

fungsi pada shell scripting adalah sebagai berikut:

#!/bin/bash# Function without passing value

function do_usage(){ echo "This script is created for learning" echo "usage : ./this.sh <whatever>" exit;}

if [ -z $1 ]then do_usageelse echo $1fi

Penggunaan fungsi di atas adalah contoh sederhana penggunaan fungsi tanpa inputan, tetapi

sering dijumpai bahwa sebuah fungsi harus diberi input dan memberikan nilai balik (return value).

Contoh penggunaan fungsi yang lain adalah:

Presented in PT. Datacomm Diangraha

Page 16: Anto Shell Scripting

xvi

#!/bin/bash# Function with passing and return value

do_usage(){ echo "Another function example" echo "Usage : ./this.sh <integer> <integer>" exit;}

function sumval(){ RES=$(($1+$2)) return $RES}

if [ $# -ne 2 ]then do_usagefisumval $1 $2retval=$?if [ $retval -lt $1 ]then echo "Second passing value is negative"elif [ $retval -gt $1 ]then echo "Second passing value is positive"else echo "Second passing value is zero"fi

F. I/O Redirections

Ada 3 default I/O yaitu : stdin, stdout, dan stderr. Default file deskriptor 0 untuk stdin, 1 untuk

stdout, dan 2 untuk stderr. Beberapa jenis redirection I/O:

command > filename digunakan untuk redirect output di stdout ke file, jika file exist maka

dioverwrite.

: > filename atau > filename digunakan untuk membersihkan file menjadi 0 byte.

command >> filename digunakan untuk redirect output di stdout ke file, jika file exist maka

ditambahkan ke baris selanjutnya.

1 > filename digunakan untuk redirect stdout ke filename, jika file exist di overwrite.

1>>filename digunakan untuk redirect stdout ke filename, jika file exist ditambah ke baris

selanjutnya.

2 > filename digunakan untuk redirect stderr ke filename, jika file exist di overwrite.

Presented in PT. Datacomm Diangraha

Page 17: Anto Shell Scripting

xvii

2 >> filename digunakan untuk redirect stderr ke filename, jika file exist ditambah ke baris

selanjutnya.

&> filename digunakan untuk redirect stdout dan stderr ke filename.

2>&1 digunakan untuk redirect stderr ke stdout.

i>&j digunakan untuk redirect file deskriptor i ke file deskriptor j.

>&j digunakan untuk redirect stdout ke file deskriptor j.

j <>filename digunakan untuk operasi baca tulis filename dengan deskriptor j.

n<&- digunakan untuk close input file deskriptor n.

n>&- digunakan untuk close output file deskriptor n.

command 1| command 2 output command 1 menjadi input command 2.

Contoh penggunaan pada shell script:

echo 1234567890 > File # Write string to "File".exec 3<> File # Open "File" and assign fd 3 to it.read -n 4 <&3 # Read only 4 characters.echo -n . >&3 # Write a decimal point there.exec 3>&- # Close fd 3.cat File # ==> 1234.67890

G. Using /dev & /proc

I. Using /dev

Direktori /dev berisi daftar device yang dikenali oleh sistem operasi. Device tersebut bisa

berupa hardware atau pseudo-device. Contoh device berupa hardware adalah /dev/hda,

/dev/sda, dan /dev/cdrom. Contoh device berupa pseudo-device adalah /dev/null, /dev/tty, dan

/dev/zero. Contoh sederhana penggunaan /dev adalah :

#!/bin/bash#Simple script using /devdf -ah|awk '/^\/dev/ {print "Ukuran partisi " $6 " adalah : " $2}'#Done

Terkadang kita tidak menginginkan shell command yang kita ketikkan muncul di file bash

history. Untuk melakukan hal itu kita bisa membuat simbolik link dari .bash_history ke

/dev/null.

Presented in PT. Datacomm Diangraha

Page 18: Anto Shell Scripting

xviii

#!/bin/bash#Simple script using /devif [ -f ~/.bash_history ]then rm –f ~/.bash_historyfiln –s /dev/null ~/.bash_history

II. Using /proc

Direktori proc merupakan pseudo-filesystem, file yang berada pada /proc menunjukkan proses

yang berjalan pada sistem dan kernel. Contoh penggunaan /proc untuk mencari jenis processor adalah:

#!/bin/bash# Get model and spped CPU in MhzMODEL=`cat /proc/cpuinfo|awk '/^model name/ {print $5}'|head -1`CPUSPEED=`cat /proc/cpuinfo|awk '/^cpu MHz/ {print $4}'|head -1`echo "CPU Model $MODEL running at $CPUSPEED Mhz"

Dengan memanfaatkan informasi yang ada pada direktori /proc, kita juga bisa mendapatkan

informasi mengenai command line dan argumen dari sebuah proses yang berjalan.

#!/bin/bash#Get shell command and argument.OPTIONS="cmdline"

if [ -z $1 ]then echo "Usage : getcmd.sh <process>" exit;fi

PID=`pidof $1|awk '{print $1}'`CMDARG=`cat /proc/"$PID"/"$OPTIONS"|xargs -0 echo`echo "Proses $1 has PID $PID and command line $CMDARG"#

H. Security Issues

Penggunaan shell scripting memang cenderung memudahkan pekerjaan namun ada beberapa

aspek keamanan yang harus diperhatikan. Beberapa issue terkait dengan shell script security adalah:

Adanya kemungkinan shell script diinfeksi oleh trojan, worm, dan malware yang lain. Karena

alasan itu jangan sekali kali menjalankan shell script menggunakan root atau menaruh shell

Presented in PT. Datacomm Diangraha

Page 19: Anto Shell Scripting

xix

script di daftar file init kecuali kita telah benar-benar menganalisis script tersebut dan

mendapatkan shell script dari sumber yang benar-benar bisa dipercaya.

Jika source code shell script cukup confidential, sembunyikan source code shell script tersebut

menjadi file binary agar tidak readable. Untuk menyembunyikan source shell script menjadi

binary executable bisa dilakukan dengan tools shc-generic shell script compiler yang bisa

didownload dari http://www.datsi.fi.upm.es/~frosal/sources/

Writing secure shell script:

Jangan meletakkan data rahasia/confidential seperti password di environment variable

misalnya export PASSWORD=secret123

Jangan melewatkan data rahasia/confidential seperti melalui commandline argumen

misalnya: mysql -u root --password=keren123

Setting environment variable PATH dengan teliti pada awal script shell sehingga

meminimalkan resiko kita mengekseksui file trapdoor. Contoh pengaturan environment

PATH adalah export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin

I. Code Poetry

Shell script yang kita buat diharapkan mudah untuk dipelajari oleh orang lain, selain itu script

yang dibuat juga harus mudah dimodifikasi dan digunakan kembali dimasa mendatang. Untuk keperluan

tersebut beberapa hal yang perlu diperhatikan :

Berikan komentar pada script yang dibuat, hal ini mempermudah orang lain memahami dan

memudahkan untuk memantain script tersebut.

Gunakan nama variable yang bermakna sesuai dengan kebutuhan. Hal ini membuat script lebih

mudah dipahami dan mempermudah pengubahan atau update script tanpa merusak script yang

telah dibuat.

Gunakan nama variable dan fungsi yang deskriptif.

Gunakan kode exit yang sistematik dan bermakna.

Jadikan kode yang kompleks menjadi kode yang sederhana, gunakan fungsi jika memungkinkan.

Gunakan parameters option yang sudah distandarkan.

Contoh penggunaan shell script dengan style adalah:

Presented in PT. Datacomm Diangraha

Page 20: Anto Shell Scripting

xx

#!/bin/bash# Shell script to check user status

export PATH=/bin:/sbin:/usr/bin:/usr/sbinFILENAME="/etc/passwd"UIDROOT=0E_NOTFOUND=95E_NOPERM=77

#Fungsi check statusfunction do_check_status(){ STATUS=$(passwd -S $1|awk '{print $2}') if [ $STATUS = "L" ] #User locked then echo "User $1 is LOCKED" fi if [ $STATUS = "P" ] #Password protected then echo "User $1 is PASSWORD PROTECTED" fi return 0 #Exit success}

#Check who runs this scriptif [ $UID -ne $UIDROOT ]then echo "Only root can run this script" exit $E_NOPERMfi

#Check if the file is existif [ ! -e $FILENAME ]then echo "File $FILENAME is not found" exit $E_NOTFOUNDfi

USERLIST=$(cat /etc/passwd|awk -F : '{print $1}') #Get userlistfor USER in $USERLISTdo do_check_status $USER #Get user statusdone

exit $?

Presented in PT. Datacomm Diangraha

Page 21: Anto Shell Scripting

xxi

3. Shell Scripting in Practice

A. Creating and Scheduling Automatic Backup

Q : Seorang engineer diberikan tugas untuk memaintain proses backup data sebuah server

core.company.com. Data dan konfigurasi tersebut harus dibackup di server backup dengan hostname

backup.company.com. Proses backup, dilakukan setiap seminggu sekali.

A : Engineer mengaktifkan service SSH pada server backup.company.com untuk keperluan

remote copy files/folders dari server core.company.com menggunakan command scp. Engineer

mengaktifkan cron pada server core.company.com agar proses backup terotomatisasi taip seminggu

sekali. Adapun yang dikerjakan oleh engineer tersebut adalah:

1. Engineer mengenerate public key dan private key agar login dari server core.company.com ke

backup.company.com menggunakan autentikasi RSA.

root@core# ssh-keygen –t rsa –b 1024root@core# scp ~/.ssh/id_rsa.pub [email protected]:/root/.ssh/authorized_keys

(output truncated)

2. Engineer membuat bash script sederhana untuk membackup dan mencopy ke server backup.

#!/bin/bashTARGET="`date +%F`-home.tar.gz"TMP="/opt/tmp"ROOTUID=0BACKUPSERV="backup.company.com"BACKUPDIR=/var/backups

if [ "$UID" -ne "$ROOTUID" ]then echo "Only root can run this script!"; exit;fi

mkdir $TMPtar cvfzP $TMP/$TARGET /home > /dev/nullscp -fr $TMP/$TARGET root@$BACKUPSERV:$BACKUPDIR > /dev/nullrm -rf $TMP#EOF

3. Engineer mengedit konfigurasi file cron (/etc/crontab) agar mengeksekusi bash script pada

nomor 2 setiap minggu sekali (misalnya setiap sabtu sore jam 18:30).

30 18 * * 7 root /root/backup.sh

Presented in PT. Datacomm Diangraha

Page 22: Anto Shell Scripting

xxii

4. Tugas engineer selesai

Scheduling & Automatic Backup Selesai.

B. Creating and Scheduling Automatic Integrity File Checker

Q : Seorang engineer diberi tugas untuk memantau integritas file file binary pada sistem operasi

linux untuk mengetahui secara dini jika file-file tersebut disusupi malware. Tugas tersebut harus

dilakukan engineer setiap hari untuk memastikan deteksi dini adanya penyusupan.

A : Engineer mengelompokkan file-file binary yang rawan diinfeksi malware, dia kemudian

mebuat bash script untuk mendata md5 checksum semua file binary tersebut dan menyimpannya

kedalam file.

#!/bin/bash#Integrity CheckerBASEDIR=/home/antoDATA=$BASEDIR/.md5file.txtLOG=$BASEDIR/`date +%d-%m-%Y`-md5log.txtFILE="/bin/login/bin/ls/bin/su/bin/netstat/bin/ps/usr/bin/top/usr/bin/lsof/usr/bin/md5sum/usr/bin/ssh/usr/bin/scp/usr/sbin/sshd"

if [ -z $1 ]then echo "Gunakan : ./integrity.sh <-create|-check>" exitficase "$1" in "-create") md5sum $FILE > $DATA ;; "-check") rm -f $BASEDIR/*md5log.txt md5sum -c $DATA md5sum -c $DATA > $LOG ;; *) echo "Error parameter" ;;esac

Presented in PT. Datacomm Diangraha

Page 23: Anto Shell Scripting

xxiii

Untuk membuat data md5 checksum setiap file binary yang didaftarkan, eksekusi script tersebut

dengan options –create. Untuk melakukan pengecekan md5 checksum, eksekusi script tersebut dengan

options –check. Agar script dieksekusi setiap pagi (misalnya pukul 06:30) engineer melakukan

pengeditan file cron (/etc/crontab). Hasil pengecekan bisa dilihat engineer kapan saja di file log yang

ditentukan.

30 06 * * * root /home/anto/integrity.sh -check

Tugas engineer sudah selesai, sekarang dia cukup melihat log script diatas untuk memantau

potensi adanya infeksi malware.

C. DomainToIP Enumeration Script

Q : Dalam menyelesaikan tugasnya, seorang engineer diminta untuk memetakan alamat domain

menjadi alamat IP, mengetahui mail exchanger yang digunakan, dan authority nameserver domain

tersebut. Engineer bisa saja menggunakan shell command seperti host, nslookup, dan dig tetapi dia

menginginkan hasilnya lebih teratur dan mudah dibaca. Berhubung banyaknya domain yang sering dia

periksa, engineer menginginkan proses pengecekan dilakukan secara massive.

A : Engineer memanfaatkan shell command yang ada kemudian memodifikasi outputnya

menggunakan shell script. Engineer juga menambah fitur pada shell script itu agar bisa menerima

inputan berupa file yang berisi domain list.

Presented in PT. Datacomm Diangraha

Page 24: Anto Shell Scripting

xxiv

#!/bin/bash# Domain to IP checker

function do_usage(){ echo "Domain to IP addresss checker" echo "Usage : ./domain2ip.sh <-h|-f> <domain|file>" exit;}

function domain2ip(){ DOM=$1 IPADDR=(`host -t A $DOM|awk '{print $4}'`) echo Domain $DOM is mapped in ${#IPADDR[@]} ip address : for S_IPADDR in ${IPADDR[@]};do echo $S_IPADDR;done MXADDR=(`host -t mx $DOM|awk '{print $7}'`) echo Domain $DOM has ${#MXADDR[@]} mail exchanger : for S_MXADDR in ${MXADDR[@]};do echo $S_MXADDR;done NSADDR=(`host -t ns $DOM|awk '{print $4}'`) echo Domain $DOM has ${#NSADDR[@]} authority nameserver : for S_NSADDR in ${NSADDR[@]};do echo $S_NSADDR;done}

if [ $# -ne 2 ]then do_usagefi

case "$1" in "-h") domain2ip $2 ;; "-f") if [ ! -r $2 ] then echo "Can not open file for reading" exit; fi for DOMAIN in `cat $2` do domain2ip $DOMAIN sleep 2 done ;; *) do_usage ;;esac

Presented in PT. Datacomm Diangraha

Page 25: Anto Shell Scripting

xxv

D. Start & Stop GRE Tunneling

Q : Engineer diberi tugas untuk memaintain koneksi antar head office dengan branch office.

Koneksi kedua kantor melalui VPN over internet memanfaatkan GRE tunneling. IP Gateway head office

222.124.164.1 dan LAN 172.16.1.0/24 sedangkan branch office 202.155.0.1 dan LAN 172.16.10.0/24.

Link GRE tunnel adalah 10.1.1.0/30 dengan 10.1.1.1 pada head office.

A : Untuk memudahkan memulai dan menghentikan tunneling, engineer membuah script shell.

Contoh script shell untuk dipasang pada gateway head offcice tersebut adalah:

#!/bin/bash# Start Stop GRE Tunnel

LOCAL_IP=222.124.164.1REMOTE_IP=202.155.0.1REMOTE_LAN=172.16.10.0/24GRE_IPADDR=10.1.1.1/30GRE_GW=10.1.1.2

if [ -z $1 ]then echo "Usage : ./gre.sh <-start|-stop>" exitfi

case "$1" in "-start") ip tunnel add netbr mode gre remote $REMOTE_IP local $LOCAL_IP ip addr add $GRE_IPADDR dev netbr ip link set netbr up ip route add $REMOTE_LAN via $GRE_GW dev netbr ;; "-stop") ip route del $REMOTE_LAN via $GRE_GW dev netbr ip link set netbr down ip tunnel del netbr ;; *) echo "ERR : wrong parameter" ;;esac

Agar kode ini dijalankan ketika proses booting init sistem operasi, maka shell script ini

ditambahkan pada file /etc/rc.local.

/root/gre.sh -start

Presented in PT. Datacomm Diangraha

Page 26: Anto Shell Scripting

xxvi

Tugas engineer selesai .

E. Automatic Default Routing Switcher Script

Q : Sebuah perusahaan berlangganan pada dua ISP, perusahaan tersebut berlanggana sebesar 4

Mbps dari ISP A dan digunakan sebagai jalur internet sehari-hari dan sebesar 512 Kbps dari ISP B untuk

keperluan kalau sewaktu waktu koneksi dari ISP A down. Sebagai network administrator, anda

menghendaki proses penggantian ISP A ke ISP B di otomatisasi ketika ISP A down. Sayangnya

perusahaan anda hanya diberi routing statik oleh kedua ISP tersebut.

A : Engineer membuat shell script sederhana untuk melakukan pengecekan koneksi melalui ISP

A menggunakan utility ping. Jika koneksi down maka default routing diarahkan melalui ISP B, tetapi jika

koneksi melalui ISP A up maka default routing diarahkan kembali ke ISP A. Pengecekan up/down koneksi

ISP A dilakukan setiap 3 menit sekali. Informasi dari ISP bahwa IP Default gateway ISP A adalah

202.152.10.1 sedangkan IP default gateway ISP B adalah 222.124.82.1, maka shell scriptnya adalah:

#!/bin/bash# Route switcher

DEFGW_ISP_A="202.152.10.1"DEFGW_ISP_B="222.124.82.1"ROOTUID=0

if [ $UID -ne $ROOTUID ]then echo "Only root can run this script" exitfi

ping -c 3 $DEFGW_ISP_A > /dev/null 2>&1

if [ $? -eq 0 ]then CURGW=`netstat -rn|awk '/^0.0.0.0/ {print $2}'` if [ $CURGW != $DEFGW_ISP_A ] then route del default gw $CURGW route add default gw $DEFGW_ISP_A fielse route del default gw $DEFGW_ISP_A route add default gw $DEFGW_ISP_Bfi

#EOF

Presented in PT. Datacomm Diangraha

Page 27: Anto Shell Scripting

xxvii

Selanjutnya engineer harus mengubah konfigurasi cron pada file /etc/crontab agar

mengeksekusi script ini setiap 3 menit sekali.

*/3 * * * * root /root/route-sw.sh

Tugas network administrator selesai

F. Start & Stop Firewall Script

Q : Sebuah server menjalankan service HTTP, HTTPS, dan SSH dimana semua service tersebut

harus bisa diakses dari internet. Sebagai sistem administrator anda menginginkan firewall (iptables)

pada server tersebut hanya mengizinkan koneksi inbound ke 3 port tersebut.

A : Sistem administrator memanfaatkan iptables kemudian meracik aturan aturan terkait

dengan koneksi inbound kemudian membendlenya dalam sebuah shell script. Shell script yang dibuat

bisa dieksekusi secara manual oleh sang admin atau dijalankan saat booting init melalui file /etc/rc.local.

Presented in PT. Datacomm Diangraha

Page 28: Anto Shell Scripting

xxviii

#!/bin/bash# Firewall host to allow only inbound to 22,80,443 tcp

IFACE="eth0"INPORT="22,80,443"ROOTUID=0

if [ $UID -ne $ROOTUID ]then echo "Only root can run this script" exitfi

if [ -z $1 ]then echo "Usage : ./firewall.sh <-start|-stop>" exit;fi

function fwstart(){

modprobe ipt_limit modprobe ipt_state

iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP #To allow inbound to 22,80,443 tcp iptables -A INPUT -p tcp --syn -m state --state NEW -m limit --limit 5/s -m multiport --destination-ports $INPORT -i $IFACE -j ACCEPT iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT #To allow DNS system iptables -A INPUT -p udp --sport 53 -m limit --limit 3/s -j ACCEPT iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -j DROP #Forward and Outbound all accepted iptables -A FORWARD -j ACCEPT iptables -A OUTPUT -j ACCEPT}

function fwstop(){ iptables -X iptables -F}

case "$1" in "-start") fwstart ;; "-stop") fwstop ;; *) echo "ERROR: wrong parameter" ;;esac

Presented in PT. Datacomm Diangraha

Page 29: Anto Shell Scripting

xxix

G. Start & Stop Bandwith Management Script

Pada linux traffic control dimanage menggunakan tools tc dan iptables tabel mangle. Ada

beberapa teknik management bandwith pada sistem operasi linux tetapi yang paling sering digunakan

adalah Class-Based Queueing (CBQ) dan Hierarchy Token Bucket (HTB).

Pembahasan bandwith management diluar cakupan tulisan ini, namun untuk script management

bandwith bisa diperoleh dari:

cbq.init diperoleh di sourceforge di http://sourceforge.net/projects/cbqinit/

htb.init diperoleh di sourceforge di http://sourceforge.net/projects/htbinit/

htb-gen diperoleh di freshmeat di http:// freshmeat.net/projects/htb-gen/

H. Datacomm Needs? Q & A

Presented in PT. Datacomm Diangraha


Recommended