title | author | institute | date | theme | linkcolor |
---|---|---|---|---|---|
Shell Scripting |
Praktikum Sistem Operasi |
Ilmu Komputer IPB |
2019 |
Dresden |
. |
- script berisi kumpulan perintah shell
- fitur: variabel, pemilihan, perulangan, fungsi, ...
- berguna untuk:
- pemrosesan teks
- otomasi administrasi sistem
- contoh:
- script instalasi lab: https://bit.ly/2CksAGQ
- script setting VM UTBK: https://bit.ly/36SJdqi
-
Buat file teks
hello
yang berisi:#!/bin/sh echo "Hello world, $USER" exit 0
-
Berikan permission untuk execute
$ chmod +x hello
-
Jalankan program
hello
$ ./hello
man sh
{.sh}- DevHints.io
- CommandLineFu.com
# all datatype is string
# no space around `=` assignment
fname="Steve"
lname="Bourne"
echo $fname
echo "$fname $lname"
echo "${lname}, ${fname}"
Membaca satu baris masukan.
read NAME...
read var
# <ketikkan masukan>
echo $var
*
{.sh}: nol atau lebih karakter apapun?
{.sh}: satu karakter apapun[...]
{.sh}: satu karakter di dalam range[!...]
{.sh}: satu karakter selain dalam range
ls /bin/e*
# /bin/echo /bin/ed /bin/egrep
ls /bin/e?
# /bin/ed
ls /bin/[cde]?
# /bin/cp /bin/dd /bin/df /bin/ed
ls /bin/[!a-n]?
# /bin/ps /bin/rm /bin/sh /bin/ss /bin/su
web="cs.ipb.ac.id"
echo $web
# cs.ipb.ac.id
echo ${#web}
# 12
echo ${web%.ac.id}
# cs.ipb
echo ${web#cs.}
# ipb.ac.id
$(...)
Menjalankan perintah dan mengembalikan keluarannya.
echo "I am $(whoami)."
# I am root.
echo "Today is $(date +%A)."
# Today is Tuesday.
$((...))
Mengevaluasi ekspresi aritmatika dan mengembalikan keluarannya.
x=5; y=3
echo $((x + y)) $((x * y)) $((x / y)) $((x % y))
echo $((x > y)) $((x == y)) $((x > y && y > 0))
echo $((RANDOM%100))
$@
{.sh}: semua parameter$0
{.sh}: nama program$1
{.sh}: parameter pertama$2
{.sh}: parameter kedua- ...
$#
{.sh}: jumlah semua parameter$?
{.sh}: status keluaran perintah terakhir$!
{.sh}: PID proses background terakhir$$
{.sh}: PID proses shell
if ...
then ...
elif ...
then ...
else
...
fi
Mengevaluasi ekspresi kondisional.
[ EXPR ]
-f FILE
: file biasa?-d FILE
: file direktori?-r FILE
: file bisa dibaca?-w FILE
: file bisa ditulis?STR1 = STR2
: kedua string sama?INT1 -eq INT2
: kedua angka sama?INT1 -lt INT2
: lebih kecil?INT1 -gt INT2
: lebih besar?
[ -r /etc/passwd ]; echo $?
# 0 (true)
[ -w /etc/passwd ]; echo $?
# 1 (false)
[ "cat" = "long" ]; echo $?
# 1 (false)
[ 10000 -gt 9999 ]; echo $?
# 0 (true)
case WORD in
PATTERN)
... ;;
PATTERN)
... ;;
esac
for NAME in WORDS
do ...
done
Mencetak sekuens angka, berguna untuk perulangan for
.
seq [FIRST [INCREMENT]] LAST
seq 10
# 1 2 3 4 5 6 7 8 9 10
seq 1 2 10
# 1 3 5 7 9
while ...
do ...
done
until ...
do ...
done
NAME () {
...
}
#!/bin/sh
# create public_html directory if not exist
webdir="~/public_html"
if [ ! -d $webdir ]; then
mkdir $webdir
fi
exit 0
#!/bin/sh
# is today weekend?
case $(date +%a) in
Sat|Sun)
echo "weekend";;
*)
echo "weekday";;
esac
#!/bin/sh
# cube from 1 to 10
for i in $(seq 10); do
echo $((i*i*i))
done
exit 0
#!/bin/sh
# Caesar cipher (ROT13)
rot13 () {
tr A-Z N-ZA-M
}
uppercase () {
tr a-z A-Z
}
uppercase | rot13
exit 0
#!/bin/sh
# integer divisible by 3 or 5 between 1-100
count=0
for i in $(seq 100); do
if [ $((i%3 == 0 || i%5 == 0)) -eq 1 ]; then
count=$((count + 1))
fi
done
echo $count
- catatan: shell script tidak cocok untuk program aritmatika
- gunakan bahasa lain yang lebih sesuai, misal Python atau Ruby
Buatlah program "topwords
{.sh}" untuk mencetak 5 kata dengan frekuensi terbanyak dari masukan stdin
!
$ man ls | ./topwords
21 of
20 sort
19 by
18 the
16 with
- ubah ke lowercase
- jadikan satu kata satu baris
- urutkan
- hitung kemunculan kata yang sama
- urutkan berdasarkan angka secara menurun
- ambil 5 baris teratas
Server NCC diserang dari luar melalui port SSH. Cek isi log file auth.log.gz
1 dan
identifikasi n alamat IP penyerang terbanyak!
$ ./top-ip-attack auth.log.gz 3
116.31.116.52 3859
221.194.47.229 1882
221.194.47.208 1819
- tampilkan file log dengan
zcat
{.sh} - ambil baris yang mengandung kata
'Failed'
{.sh} - ekstrak alamat IP tiap baris
- urutkan
- hitung kemunculan alamat IP yang sama
- urutkan berdasarkan angka secara menurun
- ambil n baris teratas
Bantulah asprak SO untuk mengidentifikasi praktikan yang belum mengumpulkan tugas email.
Diberikan file auriza.mbox
2, ambil nama user-nya, kemudian bandingkan dengan
daftar user pada file passwd
3!
$ ./check-no-mail
anni
michaeln
...
- Daftar pengirim email
- tampilkan file kotak surat
- ambil baris yang mengandung kata
'From '
{.sh} - ekstrak nama user
- urutkan
- hilangkan nama yang berulang
- Daftar semua user
- tampilkan file
/etc/passwd
- ambil baris yang mengandung kata
'G64'
{.sh} - ekstrak nama user
- urutkan
- tampilkan file
- Cari bedanya
- bandingkan keluaran dua pipeline di atas dengan
diff
{.sh} - sesuaikan format sesuai keluaran yang diminta
- bandingkan keluaran dua pipeline di atas dengan