Když program požádá o vstup uživatele, očekávejte odeslání odpovědi bez jakékoli interakce uživatele.
Instalace
Systémy založené na Debianu apt, jako je Ubuntu
sudo apt update
sudo apt install -y expect
Systémy založené na Red Hatu, jako je Centos
# Centos 7
sudo yum install -y expect
# Centos 8
sudo dnf install -y expect
Pokud se zobrazí chyby o umístění příkazu Expect, můžete umístění získat pomocí příkazu which:
which expect
which autoexpect
Příklad
Uložte to do name.sh
#!/bin/bash
echo "What is your name?"
read name
echo "Your name is ${name}"
Udělejte skript spustitelným:
chmod +x name.sh
# Execute
./name.sh
Když skript spustím ručně, vyzve mě k zadání jména pomocí What is your name?
poté se vytiskne po zadání.
Můžeme použít expect
poskytnout automatickou odpověď na dotaz. Zde je skript:
Uložte to do auto.exp
#!/usr/bin/expect
set timeout -1
spawn ./name.sh
expect "What is your name?\r"
send -- "John\r"
expect eof
Udělat čitelný a spustitelný:
chmod +x auto.exp
Toto je výstup, když je skript spuštěn pomocí ./auto.exp
:
➜ ./auto.exp
spawn ./name.sh
What is your name?
John
Your name is John
Práce s proměnnými
Příkaz set můžete použít k definování proměnných v očekávaných skriptech, jako je tento:
set user kip
set age 10
Chcete-li získat přístup k proměnné, uveďte před ní $
jako v bash (např. $user
)
K definování argumentů příkazového řádku v očekávaných skriptech používáme následující syntaxi:
set USER [lindex $argv 0]
Zde definujeme proměnnou USER, která se rovná prvnímu předávanému argumentu.
Můžete získat první a druhý argument a uložit je do proměnných takto:
set USER [lindex $argv 0]
set PASSWORD [lindex $argv 1]
Příklad skriptu s proměnnými
Další způsob, jak toho dosáhnout bez vytváření skriptu:
Příklad pro změnu hesla sftp. Uložte je do ./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"
Spusťte script pomocí
./sftp_password_change.exp $curpass $newpass $user $server
Automaticky očekávat
autoexpect
příkaz vám umožní zadat váš skript jako argument a poté skript vytvoří za vás.
Použijete příkaz jako autoexpect ./installapp a ten vytvoří očekávaný skript s odpověďmi, které poskytnete:
$ autoexpect ./name.sh
autoexpect started, file is script.exp
What is your name?
John
Your name is John
autoexpect done, file is script.exp
Výsledný script.exp
soubor pak bude obsahovat vysvětlení, že byl vytvořen s autoexpect, a bude obsahovat odpovědi, které jste poskytli.
Nástroj autoexpect připraví skript pro neinteraktivní spuštění instalace. Poté můžete provést instalace, aniž byste museli zadávat podrobnosti nebo jen naplánovat, aby se spouštěly samy.
Toto je vygenerovaný obsah bez komentářů
$ 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
Závěr
expect
command je užitečný pro spouštění skriptů, které vyžadují dlouhou řadu odpovědí, a umožňuje vám je spouštět bezobslužným způsobem, zatímco autoexpect usnadňuje vytváření očekávaných skriptů, aniž byste se museli stresovat syntaktickými detaily.