0

当我尝试执行 autoexpect 文件时出现错误send: spawn id exp7 not open 这是我的文件sh.exp

#!/usr/bin/expect

# mysql credentials and connection data
db_host='localhost'
db_name='webui_dev'
db_user='root'
db_pass=''
new_db_name='db_2011'

expect <<EOF
  log_user 0
  spawn mysql -h $db_host -u $db_user -p $db_pass 'create database $new_db_name'
  expect "password:"
  send "$db_pass\r"
  log_user 1
  expect eof
EOF

找不到哪里出错了。

4

1 回答 1

2

尝试正确引用您的变量:

  spawn mysql -h "$db_host" -u "$db_user" -p "$db_pass" "create database $new_db_name"

未在双引号中引用的变量会受到分词和路径名扩展的影响。单引号下的变量不会扩展。在此处阅读有关 shell 引用的更多信息。

更新:您似乎实际上是通过此处文档对其进行扩展,但它仍然适用,因为您的论点仍需要在期望中引用。这就是预期的输入:

  log_user 0
  spawn mysql -h "localhost" -u "root" -p "" "create database db_2011"
  expect "password:"
  send "\r"
  log_user 1
  expect eof

如果您还没有引用它,这就是它的显示方式:

  ...
  spawn mysql -h localhost -u root -p  'create database db_2011'
  ...

更新:

问题的原因实际上是因为mysql由于额外的参数而快速结束而没有显示密码提示。解决方案是手动发送命令。最好将整个脚本作为期望脚本运行,而不是嵌入式脚本,以减少混淆

#!/usr/bin/expect

# mysql credentials and connection data
set db_host "localhost"
set db_name "webui_dev"
set db_user "root"
set db_pass ""
set new_db_name "db_2011"

log_user 0
spawn mysql -h "$db_host" -u "$db_user" -p
expect "password:"
send "$db_pass\r"
expect "mysql>"
send "create database $new_db_name; exit; \r"
log_user 1
expect eof

将脚本保存为期望文件并使用expect -f expect_file.

于 2013-09-15T13:07:19.237 回答