Saat sebuah program meminta input pengguna, harap kirimkan respons tanpa interaksi pengguna apa pun.
Pemasangan
Sistem berbasis Debian apt seperti Ubuntu
sudo apt update
sudo apt install -y expect
Sistem berbasis Red Hat seperti Centos
# Centos 7
sudo yum install -y expect
# Centos 8
sudo dnf install -y expect
Jika Anda mendapatkan kesalahan tentang lokasi dari perintah Harapkan, Anda bisa mendapatkan lokasi menggunakan perintah which:
which expect
which autoexpect
Contoh
Simpan ini di name.sh
#!/bin/bash
echo "What is your name?"
read name
echo "Your name is ${name}"
Jadikan skrip dapat dieksekusi:
chmod +x name.sh
# Execute
./name.sh
Ketika saya menjalankan skrip secara manual, saya diminta untuk memasukkan nama dengan What is your name?
kemudian dicetak setelah saya masuk.
Kita bisa menggunakan expect
untuk memberikan respons otomatis terhadap kueri. Berikut scriptnya:
Simpan ini ke auto.exp
#!/usr/bin/expect
set timeout -1
spawn ./name.sh
expect "What is your name?\r"
send -- "John\r"
expect eof
Jadikan dapat dibaca dan dieksekusi:
chmod +x auto.exp
Ini adalah output ketika skrip dijalankan dengan ./auto.exp
:
➜ ./auto.exp
spawn ./name.sh
What is your name?
John
Your name is John
Bekerja dengan Variabel
Anda dapat menggunakan perintah set untuk mendefinisikan variabel dalam skrip ekspektasi seperti ini:
set user kip
set age 10
Untuk mengakses variabel, awali dengan $
seperti di bash (mis. $user
)
Untuk mendefinisikan argumen baris perintah dalam skrip ekspektasi, kami menggunakan sintaks berikut:
set USER [lindex $argv 0]
Di sini kita mendefinisikan variabel USER, yang sama dengan argumen yang diteruskan pertama.
Anda bisa mendapatkan argumen pertama dan kedua dan menyimpannya dalam variabel seperti ini:
set USER [lindex $argv 0]
set PASSWORD [lindex $argv 1]
Contoh skrip dengan variabel
Cara lain untuk melakukannya tanpa membuat skrip:
Contoh untuk mengubah kata sandi sftp. Simpan ini ke ./sftp_password_change.exp
.
#!/usr/bin/expect
set timeout 10
set curpass [lindex $argv 0];
set newpass [lindex $argv 1];
set user [lindex $argv 2];
set server [lindex $argv 3];
expect <<EOF
spawn sftp -P 15422 [email protected]$server
expect "Password:"
send "$curpass\r"
expect "Old Password:"
send "$curpass\r"
expect "New Password:"
send "$newpass\r"
expect "Reenter New Password:"
send "$newpass\r"
expect "sftp>"
send "exit\n"
Jalankan skrip dengan
./sftp_password_change.exp $curpass $newpass $user $server
Harapan otomatis
autoexpect
perintah memungkinkan Anda memberikan skrip Anda sebagai argumen kemudian itu akan membuat skrip untuk Anda.
Anda menggunakan perintah seperti autoexpect ./installapp dan itu akan membangun skrip ekspektasi dengan jawaban yang Anda berikan:
$ autoexpect ./name.sh
autoexpect started, file is script.exp
What is your name?
John
Your name is John
autoexpect done, file is script.exp
script.exp
yang dihasilkan file kemudian akan menyertakan penjelasan bahwa itu dibuat dengan harapan otomatis dan akan menyertakan tanggapan yang Anda berikan.
Alat ekspektasi otomatis menyiapkan skrip untuk menjalankan penginstalan secara non-interaktif. Anda kemudian dapat melakukan penginstalan tanpa harus memberikan detailnya atau hanya menjadwalkannya untuk berjalan sendiri.
Ini adalah konten yang dihasilkan tanpa komentar
$ cat script.exp
#!/usr/bin/expect -f
#
set force_conservative 0 ;# set to 1 to force conservative mode even if
;# script wasn't run conservatively originally
if {$force_conservative} {
set send_slow {1 .1}
proc send {ignore arg} {
sleep .1
exp_send -s -- $arg
}
}
set timeout -1
spawn ./name.sh
match_max 100000
expect -exact "What is your name?\r
"
send -- "John\r"
expect eof
Kesimpulan
expect
command berguna untuk menjalankan skrip yang membutuhkan rangkaian jawaban yang panjang dan memungkinkan Anda untuk menjalankannya secara tidak berawak sementara autoexpect memudahkan untuk membuat skrip yang diharapkan tanpa menekankan detail sintaksis.