GNU/Linux >> Znalost Linux >  >> Linux

Automatizujte odezvu pomocí Expect a Autoexpect v Linuxu

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.


Linux
  1. Jak nastavit statickou IP adresu a nakonfigurovat síť v Linuxu

  2. Použití kbhit() a getch() v Linuxu

  3. Použití rz a sz pod linuxovým shellem

  1. Zkontrolujte místo na disku v Linuxu pomocí příkazů df a du

  2. Instalace a používání Homebrew Package Manager v systému Linux

  3. Jak nastavit prioritu procesu Linux pomocí příkazů nice a renice

  1. Jak nastavit automatizaci úloh na Linux VPS pomocí Cronu?

  2. Nainstalujte python-openstackclient na Linux a Mac OS

  3. Nastavte systémové datum a čas pomocí C++ v Linuxu