Используйте сценарий ожидаемого с ожидаемым - PullRequest
1 голос
/ 20 апреля 2020

Я хочу получить значение из команды sql ниже. Но я каждый раз получаю сообщение об ошибке. Ожидаемый код:

#!/usr/bin/expect
set timeout 60

spawn ssh -i id_rsa user@xxx.xxx.xxx.xxx 
sleep 10
send -- "sudo su\r"
sleep 10
expect '[sudo] password for user: ' 
send -- "secret\r" 
sleep 2
send "mysql -u root\r"
sleep 2
send -- "use nextcloud;\r" 
sleep 2
send -- "SELECT * FROM oc_accounts;\r"

Сообщение об ошибке:

spawn ssh -i id_rsa user@xxx.xxx.xxx.xxx
invalid command name "sudo"
    while executing
"sudo"
    invoked from within
"expect '[sudo] password for user: ' "
    (file "./test.sh" line 8)

1 Ответ

1 голос
/ 20 апреля 2020

Одиночные кавычки не имеют особого значения в ожидании. Ожидается, что это расширение Tcl, где фигурные скобки - это не интерполирующий механизм цитирования .

Вы получаете ошибку «недопустимое имя команды», поскольку квадратные скобки являются синтаксисом подстановки команд Tcl.

Вы хотите

expect {[sudo] password for user: }

Вместо sleep с idiomati c ожидайте, что вы должны expect некоторый шаблон: приглашение вашей удаленной оболочки, приглашение mysql и т. Д. c.


@ pynexj имеет хорошее замечание. Попробуйте

expect -exact {[sudo] password for user:}
...