catatanlepas.com

  • Increase font size
  • Default font size
  • Decrease font size
  • default color
  • black color
Home Komputer Pemrograman Dasar-Dasar Expect

Dasar-Dasar Expect

Email Cetak PDF

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.

#!/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:
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:

#!/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:

#!/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:

#!/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:
#!/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.

#!/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:

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

+ 1
+ 1
Comments
Add New Search
budi_mulyana   |110.136.107.xxx |2010-03-12 21:44:29
wah artikelnya bagoes benar...
terima kasih mas..
ada trouble shoot nih dengan expect
gimana buat ngirim ke sebuah file
dengan expect....
alias redirect...mohon ya mas
bantuannya...?
catatan   |SAdministrator |2010-03-15 14:45:16
Terima kasih mas atas penilaiannya.
Hanya saja saya agak bingung dengan pertanyaan mas. Maksud dari mengirim ke sebuah file dengan expect maksudnya apa ya?
Bukankah dengan menggunakan ftp juga bisa mengirimkan file mas?
fauzan   |61.247.17.xxx |2011-12-01 17:50:30
keren mas.. mau nanya nih mas..
kalo saya remote via ssh untuk tau list file di suatu directory lalu output listing file tersebut ingin kita tulis ke file di sisi kita gimana caranya yah.. tks
catatan   |SAdministrator |2011-12-04 23:22:24
Halo Fauzan,
Sudah mencoba aplikasi scp?

Semoga Membantu ...
Write comment
Name:
Email:
 
Website:
Title:
UBBCode:
[b] [i] [u] [url] [quote] [code] [img] 
 
 
:angry::0:confused::cheer:B):evil::silly::dry::lol::kiss::D:pinch:
:(:shock::X:side::):P:unsure::woohoo::huh::whistle:;):s
:!::?::idea::arrow:
 
Please input the anti-spam code that you can read in the image.

3.26 Copyright (C) 2008 Compojoom.com / Copyright (C) 2007 Alain Georgette / Copyright (C) 2006 Frantisek Hliva. All rights reserved."

Terakhir Diperbaharui ( Jum'at, 13 Agustus 2010 07:22 )  

Tanggal dan Jam


Ulti Clocks content

Browse this website in:


Mutiara Hari Ini

Jika salah seorang dari kalian mengantuk saat shalat, hendaklah tidur (dahulu) hingga ia mengetahui apa yang ia baca. (HR. Bukhari No. 206)

Poling

Apakah artikel-artikel di situs ini bermanfaat untuk anda?

(283 votes)

7.8%
92.2%

Waktu Shalat