I. Pendahuluan
Pada artikel sebelumnya sudah dijelaskan tentang dasar-dasar bash yang memudahkan seorang administrator untuk mengerjakan pekerjaan administrator sehari-hari. Namun walaupun begitu, bash masih mempunyai sebuah kekurangan yaitu bash hanya bisa bekerja pada satu server saja dan tidak bisa mengerjakan perintah-perintah untuk membuat komunikasi dengan server lain seperti ssh, telnet, dan sebagainya. Sebagai solusinya ada sebuah bahasa pemrograman yang bernama expect untuk mengerjakan hal-hal tersebut.
II. Expect
Expect merupakan bahasa pemrograman yang dibuat oleh Don Libes dan merupakan turunan dari bahasa Tcl/Tk. Bahasa pemrograman ini digunakan untuk membuat otomatisasi layanan-layanan seperti telnet, ssh, telnet, dan sebagainya dimana bahasa bash tidak mampu untuk melakukan hal tersebut. Untuk melihat apakah paket expect ada di sistem kita, ketikkan perintah berikut:
# rpm -qa | grep expect
Jika memang tidak ada, kita akan mendownload paket expect tersebut dengan cara:
# yum install expect*
III. Skrip Shell
Sama seperti bash, expect harus diawali dengan sha-bang. untuk melihat dimana expect di dalam kita, ketikkan perintah berikut:
# whereis expect
karena penulis menggunakan centos 5.4 maka shabang expect berada di /usr/bin/expect.
Skrip expect secara normal di baca oleh komputer atau di interpreter baris per baris. Jika ingin menggunakan lebih satu perintah dalam satu baris, maka harus dipisahkan dengan tanda titik koma (;). Di bawah ini adalah contoh sederhana dari expect dengan file yang bernama lat1.
Skrip expect secara normal di baca oleh komputer atau di interpreter baris per baris. Jika ingin menggunakan lebih satu perintah dalam satu baris, maka harus dipisahkan dengan tanda titik koma (;). Di bawah ini adalah contoh sederhana dari expect dengan file yang bernama lat1.
#!/usr/bin/expect -f send "hello world\n"Setelah itu kita eksekusi file tersebut dan lihat hasilnya dengan cara:
# chmod +x lat1 # ./lat1
IV. Perintah expect
Expect mempunyai 4 perintah yang sangat penting untuk membuat sebuah skrip yaitu:
- spawn
Perintah ini digunakan untuk memulai sebuah program dan dalam satu skrip hanya ada satu perintah spawn
- expect
Perintah ini untuk membuat beberapa input. Untuk membuat perintah ini, kita harus mengetahui karakter apa yang tampak pada layar monitor kita. Misalnya kita ingin melakukan ftp maka akan ada promp sebagai berikut misal ingin mengambil file lat1:
- spawn
Perintah ini digunakan untuk memulai sebuah program dan dalam satu skrip hanya ada satu perintah spawn
- expect
Perintah ini untuk membuat beberapa input. Untuk membuat perintah ini, kita harus mengetahui karakter apa yang tampak pada layar monitor kita. Misalnya kita ingin melakukan ftp maka akan ada promp sebagai berikut misal ingin mengambil file lat1:
ftp> get lat1
maka expectnya harus ditulis sebagai berikut:
expect "ftp> "
Kita lihat bahwa tanda kutip terakhir harus dipisahkan dengan spasi sebab itulah yang tampak pada layar komputer kita. Jika kita menulis tanda kutip terakhir tanpa spasi maka kita akan menunggu output yang cukup lama. Dan juga kita tidak harus mengetikkan seluruh karakter yang muncul di layar komputer tetapi kita cukup mengetikkan bintang sehingga perintah di atas bisa diganti sebagai berikut:
expect "*> "
- send
Perintah ini untuk mengirimkan sesuatu ke dalam server remote dan harus diakhiri dengan \r
- interact
Perintah ini untuk mengijinkan pengguna untuk berinteraksi di server remote
Untuk lebih jelasnya tentang perintah-perintah expect diatas, perhatikan skrip berikut:
Lalu eksekusi skrip tersebut. Terlihat bahwa skrip akan menunggu user untuk mengetikkan kata hi. Jika user mengetikkan kata hi, maka skrip langsung akan mengeluarkan kata Hello world. Tetapi jika user mengetikkan selain kata hi, maka skrip akan menunggu. Secara default, skrip akan menunggu selama 10 detik sampai user tersebut mengetikkan kata hi. Tapi jika sampai 10 detik user juga belum mengetikkan kata hi atau salah memasukkan kata hi, maka skrip akan mengeluarkan output hello world. Untuk mengganti default 10 detik tersebut maka ketikkan perintah set timeout jumlah_detik. Jadi, misalnya kita hanya mau selama 5 detik, maka ketikkan dalam skrip tersebut:
Perintah ini untuk mengirimkan sesuatu ke dalam server remote dan harus diakhiri dengan \r
- interact
Perintah ini untuk mengijinkan pengguna untuk berinteraksi di server remote
Untuk lebih jelasnya tentang perintah-perintah expect diatas, perhatikan skrip berikut:
#!/usr/bin/expect -f expect "hi" send "hello world\n"
Lalu eksekusi skrip tersebut. Terlihat bahwa skrip akan menunggu user untuk mengetikkan kata hi. Jika user mengetikkan kata hi, maka skrip langsung akan mengeluarkan kata Hello world. Tetapi jika user mengetikkan selain kata hi, maka skrip akan menunggu. Secara default, skrip akan menunggu selama 10 detik sampai user tersebut mengetikkan kata hi. Tapi jika sampai 10 detik user juga belum mengetikkan kata hi atau salah memasukkan kata hi, maka skrip akan mengeluarkan output hello world. Untuk mengganti default 10 detik tersebut maka ketikkan perintah set timeout jumlah_detik. Jadi, misalnya kita hanya mau selama 5 detik, maka ketikkan dalam skrip tersebut:
set timeout 5
maka setelah 5 detik, output hello world akan keluar. Namun, perlu dicatat bahwa peletakan perintah tersebut harus sebelum perintah expect, sehingga skrip diatas akan menjadi seperti berikut:
Sebagai tambahan, jika kita ingin expect menunggu selamanya sampai user mengetikkan kata hi, maka gunakan perintah berikut:
#!/usr/bin/expect -f set timeout 5 expect "hi" send "hello world\n"
Sebagai tambahan, jika kita ingin expect menunggu selamanya sampai user mengetikkan kata hi, maka gunakan perintah berikut:
set timeout -1
Namun, jika kita ingin agar expect tidak harus menunggu user mengetikkan kata hi, gunakan perintah berikut:
set timeout 0
Untuk melihat manual lebih lanjut tentang expect ketikkan perintah:
# man expect
V. Pattern-Action Pairs
Expect juga mengijinkan penggabungan antara sebuah perintah dan sebuah pola. Penggabungan dibuat dengan cara menyusun action segera setelah pola di perintah expect itu sendiri. Lihat contoh skrip berikut ini:
Jika kita mengetikkan salah satu dari kata-kata di atas maka expect akan langsung menampilkan action yang diminta. Misalnya kita mengetikkan kata hello, maka segera setelah mengetikkan kata tersebut, expect akan menampilkan output you said hello. Tapi jika kita tidak mengetikkan sesuatu, maka expect tidak akan menampilkan action dan akan keluar dari program expect.
Expect juga mengijinkan penggabungan antara sebuah perintah dan sebuah pola. Penggabungan dibuat dengan cara menyusun action segera setelah pola di perintah expect itu sendiri. Lihat contoh skrip berikut ini:
#!/usr/bin/expect -f
set timeout 2
expect "hi" {send "You said hi\n"}\
expect "hello" {send "You said hello\n"}\
expect "bye" {send "You said bye\n"}\
send "hello world\n"
Jika kita mengetikkan salah satu dari kata-kata di atas maka expect akan langsung menampilkan action yang diminta. Misalnya kita mengetikkan kata hello, maka segera setelah mengetikkan kata tersebut, expect akan menampilkan output you said hello. Tapi jika kita tidak mengetikkan sesuatu, maka expect tidak akan menampilkan action dan akan keluar dari program expect.
VI. Contoh-contoh skrip expect
Di bawah ini adalah contoh-contoh skrip expect dengan menggunakan user boy yang ada di IP 192.168.0.3.
1. Telnet ke Ip 192.168.0.3:
Mungkin, ada yang bertanya bagaimana expect bisa melakukan hal seperti itu? Jawabannya sebagai berikut, sesudah memulai telnet maka expect akan menunggu login prompt. Ketika login prompt muncul, expect akan mengirim username (dalam kasus ini adalah boy) dan kemudian menunggu promp password. Ketika password prompt muncul, maka expect akan mengirim password dari username tersebut (dalam kasus ini password dari boy adalah password). Dan akhirnya, perintah interact mengembalikan control kepada user.
Perlu diperhatikan bahwa pada perintah send harus selalu diakhiri oleh \r sebelum tanda petik tutup. Jika tidak, maka perintah send tidak akan berjalan.
2. ftp ke IP 192.168.0.3
Skrip di atas digunakan untuk meletakkan file lat1 di IP 192.168.0.2 dengan username boy.
3. ssh ke IP 192.168.0.3
Skrip di atas digunakan untuk menggunakan service ssh ke 192.168.0.3 dengan username boy. Wajib diketahui bahwa perl hanya bisa membaca skrip per baris. Jadi ketika kita menuliskan spawn ssh maka skrip spawn tersebut harus 1 baris dengan This e-mail address is being protected from spambots, you need JavaScript enabled to view it .0.3 dan bukan terpisah seperti pada skrip diatas. Dan juga perlu diketahui bahwa skrip ini hanya berfungsi dengan baik jika kita sudah sering melakukan ssh ke Ip tersebut. Sebab jika kita menggunakan skrip tersebut untuk melakukan ssh yang pertama kali maka skrip tersebut akan mengalami kegagalan sebab jika kita menggunakan ssh pertama kali ke sebuah server, maka linux akan memberikan pernyataan sebagai berikut:
Jika kita mau menggunakan skrip tersebut untuk melakukan ssh pertama kali maka di dalam skrip tersebut harus ditambah skrip setelah skrip set timeout 2:
4. Telnet ke IP 192.168.0.3 dengan argumen
Misalnya kita beri nama skrip diatas dengan telnet. Jika kita langsung mengeksekusi skrip diatas dengan ./telnet, maka hasilnya tidak kita harpkan yaitu kita disuruh untuk menulis username dan password. Maka dari itu, seharusnya kita menulisnya seperti berikut:
1. Telnet ke Ip 192.168.0.3:
#!/usr/bin/expect -f spawn telnet 192.168.0.3 expect "login" send "boy\r" expect "Password:" send "password\r" interact
Mungkin, ada yang bertanya bagaimana expect bisa melakukan hal seperti itu? Jawabannya sebagai berikut, sesudah memulai telnet maka expect akan menunggu login prompt. Ketika login prompt muncul, expect akan mengirim username (dalam kasus ini adalah boy) dan kemudian menunggu promp password. Ketika password prompt muncul, maka expect akan mengirim password dari username tersebut (dalam kasus ini password dari boy adalah password). Dan akhirnya, perintah interact mengembalikan control kepada user.
Perlu diperhatikan bahwa pada perintah send harus selalu diakhiri oleh \r sebelum tanda petik tutup. Jika tidak, maka perintah send tidak akan berjalan.
2. ftp ke IP 192.168.0.3
#!/usr/bin/expect -f spawn ftp 192.168.0.3 set timeout 2 expect "): " send "boy\r" expect "Password:" send "password\r" expect "ftp> " send "put lat1\r" expect "ftp> " expect "ftp> " send "by\r"
Skrip di atas digunakan untuk meletakkan file lat1 di IP 192.168.0.2 dengan username boy.
3. ssh ke IP 192.168.0.3
#!/usr/bin/expect -f spawn ssh This e-mail address is being protected from spambots, you need JavaScript enabled to view it .0.3 set timeout 2 expect "*:" send "password\r" expect "]# " interact
Skrip di atas digunakan untuk menggunakan service ssh ke 192.168.0.3 dengan username boy. Wajib diketahui bahwa perl hanya bisa membaca skrip per baris. Jadi ketika kita menuliskan spawn ssh maka skrip spawn tersebut harus 1 baris dengan This e-mail address is being protected from spambots, you need JavaScript enabled to view it .0.3 dan bukan terpisah seperti pada skrip diatas. Dan juga perlu diketahui bahwa skrip ini hanya berfungsi dengan baik jika kita sudah sering melakukan ssh ke Ip tersebut. Sebab jika kita menggunakan skrip tersebut untuk melakukan ssh yang pertama kali maka skrip tersebut akan mengalami kegagalan sebab jika kita menggunakan ssh pertama kali ke sebuah server, maka linux akan memberikan pernyataan sebagai berikut:
The authenticity of host '192.168.0.3 (192.168.0.3)' can't be established. RSA key fingerprint is c2:d0:cf:82:42:d8:47:16:00:0c:7b:d6:d5:61:e7:b7. Are you sure you want to continue connecting (yes/no)? Warning: Permanently added '192.168.0.3' (RSA) to the list of known hosts. This e-mail address is being protected from spambots, you need JavaScript enabled to view it .0.3's password:
Jika kita mau menggunakan skrip tersebut untuk melakukan ssh pertama kali maka di dalam skrip tersebut harus ditambah skrip setelah skrip set timeout 2:
expect ")? " send "yes\r" expect "password: " send "password\r"
4. Telnet ke IP 192.168.0.3 dengan argumen
#!/usr/bin/expect -f
if {[llength $argv] != 2} {
puts "Script for Telnet"
puts "Usage: $argv0 username password\n"
exit 1
}
set USER_NAME [lindex $argv 0]
set PASS [lindex $argv 1]
spawn telnet 192.168.0.2
expect "login"
send "$USER_NAME\r"
expect "Password:"
send "$PASS\r"
interact
Misalnya kita beri nama skrip diatas dengan telnet. Jika kita langsung mengeksekusi skrip diatas dengan ./telnet, maka hasilnya tidak kita harpkan yaitu kita disuruh untuk menulis username dan password. Maka dari itu, seharusnya kita menulisnya seperti berikut:
# ./telnet boy password
maka skrip tersebut akan masuk ke server 192.168.0.3 secara otomatis.
5. Contoh FTP Otomatis
Berikut adalah contoh skrip untuk membuat ftp otomatis sehingga kita bisa mengirim file semau kita, tidak seperti skrip ftp di atas dimana filenya sudah ditentukan lebih dahulu.
5. Contoh FTP Otomatis
Berikut adalah contoh skrip untuk membuat ftp otomatis sehingga kita bisa mengirim file semau kita, tidak seperti skrip ftp di atas dimana filenya sudah ditentukan lebih dahulu.
#!/usr/bin/expect -f
# Cara Eksekusi
if {[llength $argv] != 2} {
puts "FTP Otomatis"
puts "Gunakan: $argv0 alamat_ip nama file"
exit 1
}
# Menentukan Variabel
set alamat [lindex $argv 0]
set file [lindex $argv 1]
# Skrip FTP Otomatis
spawn ftp $alamat
set timeout 2
expect "): "
send "arief\r"
expect "Password:"
send ".arief\r"
expect "ftp> "
send "put $file\r"
expect "ftp> "
expect "ftp> "
send "by\r"
VII. Cara mengirimkan karakter ASCII pada expect
Dari contoh di atas kita bisa melihat bahwa expect mempunyai kemampuan untuk membuka komunikasi dengan server lain. Namun bagaimana cara kita mengirimkan perintah seperti Ctrl-C , Ctrl-D di dalam expect?
Untuk melakukan hal tersebut lihat tabel berikut:
Untuk melakukan hal tersebut lihat tabel berikut:
| Oct |
Dec |
Hex |
Name |
| 000 |
0 | 0x00 | NUL |
| 001 | 1 | 0x01 | SOH, Control-A |
| 002 |
2 | 0x02 | STX, Control-B |
| 003 | 3 | 0x03 | ETX, Control-C |
| 004 | 4 | 0x04 | EOT, Control-D |
| 005 | 5 | 0x05 | ENQ, Control-E |
| 006 | 6 | 0x06 | ACK, Control-F |
| 007 | 7 | 0x07 | BEL, Control-G |
| 010 |
8 | 0x08 | BS, backspace, Control-H |
| 011 |
9 | 0x09 | HT, tab, Control-I |
| 012 |
10 | 0x0a | LF, line feed, newline, Control-J |
| 013 |
11 | 0x0b | VT, Control-K |
| 014 |
12 | 0x0c | FF, form feed, NP, Control-L |
| 015 |
13 | 0x0d | CR, carriage return, Control-M |
| 016 |
14 | 0x0e | SO, Control-N |
| 017 | 15 | 0x0f | SI, Control-O |
| 020 |
16 | 0x10 | DLE, Control-P |
| 021 | 17 | 0x11 | DC1, XON, Control-Q |
| 022 | 18 | 0x12 | DC2, Control-R |
| 023 | 19 | 0x13 | DC3, XOFF, Control-S |
| 024 |
20 | 0x14 | DC4, Control-T |
| 025 |
21 | 0x15 | NAK, Control-U |
| 026 |
22 | 0x16 | SYN, Control-V |
| 027 |
23 | 0x17 | ETB, Control-W |
| 030 | 24 | 0x18 | CAN, Control-X |
| 031 | 25 | 0x19 | EM, Control-Y |
| 032 | 26 | 0x1a | SUB, Control-Z |
| 033 | 27 | 0x1b | ESC, escape |
| 034 | 28 | 0x1c | FS |
| 035 |
29 | 0x1d | GS |
| 036 | 30 | 0x1e | RS |
| 037 | 31 | 0x1f | US |
| 040 |
32 | 0x20 | space |
| 041 |
33 | 0x21 | ",!, exclamation mark |
| 042 |
34 | 0x22 | #,double quote |
| 043 |
35 | 0x23 | hash |
| 044 |
36 | 0x24 | %,$, dollar |
| 045 |
37 | 0x25 | percent |
| 046 |
38 | 0x26 | &, ampersand |
| 047 |
39 | 0x27 | ', quote |
| 050 |
40 | 0x28 | (, open parenthesis |
| 051 |
41 | 0x29 | ), close parenthesis |
| 052 |
42 | 0x2a | *, asterisk |
| 053 |
43 | 0x2b | +, plus |
| 054 |
44 | 0x2c | ,, comma |
| 055 |
45 | 0x2d | -, minus |
| 056 |
46 | 0x2e | ., full stop |
| 057 |
47 | 0x2f | /, oblique stroke |
| 060 |
48 | 0x30 | 0, zero |
| 061 |
49 | 0x31 | 1 |
| 062 | 50 | 0x32 | 2 |
| 063 | 51 | 0x33 | 3 |
| 064 | 52 | 0x34 | 4 |
| 065 |
53 | 0x35 | 5 |
| 066 | 54 | 0x36 | 6 |
| 067 | 55 | 0x37 | 7 |
| 070 | 56 | 0x38 | 8 |
| 071 | 57 | 0x39 | 9 |
| 072 |
58 | 0x3a | :, colon |
| 073 |
59 | 0x3b | ;, semicolon |
| 074 |
60 | 0x3c | <, less than |
| 075 |
61 | 0x3d | =, equals |
| 076 |
62 | 0x3e | >, greater than |
| 077 |
63 | 0x3f | ?, question mark |
Untuk menggunakan tabel diatas hanya tinggal mengetikkan pada bagian Oct. Misalnya kita ingin memasukkan perintah Ctrl-D pada remote server setelah kita ssh ke user boy, maka hanya tinggal memasukkan scrip sebagai berikut:
expect "~]$ " send "\004\r"
Maka skrip tersebut akan mengirimkan Ctrl-D ke server remote tersebut. Mungkin tabel di atas kurang berguna jika kita hanya menggunakan expect untuk satu server saja. Namun akan sangat berguna jika kita menggunakan expect di atas untuk server yang banyak dan berpindah dari satu server ke server lain dengan menggunakan expect.
Referensi:
2 Shafar 1431 H
18 Januari 2010 M
18 Januari 2010 M
| Comments |
|
|
|||||||||||
|
|||||||||||
|
|||||||||||
|
|||||||||||
Powered by !JoomlaComment 3.26














Dear Accank, Hal itu tergantung dari...
Dear Ronald, Terima kasih atas saran...
Untuk pengguna debian 6.0 (squeeze) d...
mas sy ingin bertanya,dari semua netw...
Dear Syukran, Mungkin hadits ini bis...