Как правильно ожидать, вложенные в сценарий bash?

Вот ожидаемый файл, который может успешно работать.

#!/usr/bin/expect  -f
set host vps_ip
set user test
set loginpwd  passwd
set adminpwd  passwd
set timeout 300
set prompt "#|>|\\\$"    
spawn scp  /home/wpdatabase_backup.sql   $user@$host:/tmp
expect -nocase  "password:"
send "$loginpwd\r"
expect eof
spawn  ssh  $user@$host
expect -nocase "password:"
send "$loginpwd\r"
expect -re $prompt
send "su\r"
expect  "assword:"
send "$adminpwd\r"
expect -re $prompt
send "mysql -u root -pxxxx wpdatabase < /tmp/wpdatabase_backup.sql\r"
expect eof

Вот баш-файл:

mysqlword="xxxx"
mysqldump -u root -p$mysqlword wpdatabase > /home/wpdatabase_backup.sql

Теперь я хочу сделать файл ожидания вложенным в файл bash, потому что файл bash сложнее, чем файл ожидания, большинство строк в файле bash были опущены.

код:

#!/usr/bin/bash
mysqlword="xxxx"
mysqldump -u root -p$mysqlword wpdatabase > /home/wpdatabase_backup.sql    
/usr/bin/expect <<EOD
set host vps_ip
set user test
set loginpwd  passwd
set adminpwd  passwd
set timeout 300
set prompt "#|>|\\\$"

spawn scp  /home/wpdatabase_backup.sql   $user@$host:/tmp
expect -nocase  "password:"
send "$loginpwd\r"
expect eof
spawn  ssh  $user@$host
expect -nocase "password:"
send "$loginpwd\r"
expect -re $prompt
send "su\r"
expect  "assword:"
send "$adminpwd\r"
expect -re $prompt
send "mysql -u root -pxxxx wpdatabase < /tmp/wpdatabase_backup.sql\r"
expect eof
<<EOD

Произошла ошибка: spawn scp /home/wpdatabase_backup.sql @:/tmp
ssh: не удалось разрешить имя хоста: имя или служба не известны
потеря соединения
send: spawn id exp6 не открыт
пока выполнение
"отправить "\r""

Цитирую терминатора:

cat<<'EOD'
set host vps_ip
set user test
spawn scp  /home/wpdatabase_backup.sql   $user@$host:/tmp
EOD

Результат:

set host vps_ip
set user test
spawn scp  /home/wpdatabase_backup.sql   $user@$host:/tmp

Но как заставить вывод результата работать в bash?

/usr/bin/expect  <<cat<<'EOD'
set host vps_ip
set user test
spawn scp  /home/wpdatabase_backup.sql   $user@$host:/tmp
EOD

Код не может работать!


person showkey    schedule 09.08.2015    source источник
comment
Поскольку это bash, разве вы не должны устанавливать такие переменные, как эти user=test и host=vps_ip, вместо использования синтаксиса ожидания?   -  person Cyclonecode    schedule 09.08.2015
comment
В моей демонстрации вы забыли удалить /usr/bin/expect <<: строка с кошкой должна читаться как cat<<'EOD'. Что касается вашего сценария bash, он должен читаться как /usr/bin/expect << 'EOD' (без кота).   -  person Jens    schedule 09.08.2015


Ответы (1)


Это связано с тем, что в этом документе с терминатором без кавычек, таким как EOD, подстановка параметров выполняется оболочкой. Вы можете видеть, что если вы замените /usr/bin/expect на cat:

$ cat<<EOD
set host vps_ip
set user test
spawn scp  /home/wpdatabase_backup.sql   $user@$host:/tmp
EOD

Результат:

set host vps_ip
set user test
spawn scp  /home/wpdatabase_backup.sql   @:/tmp

Итак, как избежать подмены параметров? Цитирую терминатора:

$ cat<<'EOD'
set host vps_ip
set user test
spawn scp  /home/wpdatabase_backup.sql   $user@$host:/tmp
EOD

Результат:

set host vps_ip
set user test
spawn scp  /home/wpdatabase_backup.sql   $user@$host:/tmp
person Jens    schedule 09.08.2015
comment
Результат будет отображаться на экране. Как заставить отображаемый на экране контент работать в ожидаемой среде? - person showkey; 09.08.2015
comment
@it_is_a_literature Все, что вам нужно изменить, это указать терминатор в кавычках: /usr/bin/expect << 'EOD'. Это изменение в одну строку. В моем примере используется cat только для того, чтобы сделать видимыми какие замены оболочка делает в here-document, переданном команде. - person Jens; 09.08.2015