expect 怎么用?

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
binbinxyz
帖子: 5
注册时间: 2012-03-19 10:42
送出感谢: 0
接收感谢: 0

expect 怎么用?

#1

帖子 binbinxyz » 2016-10-23 15:15

我有这样一段交互:

代码: 全选

root@ffdf50d37cdd:/# dotnet /miner/Miner.dll /rpc
ant>open wallet /miner_data/wallets/1.db3
password:*
[07:37:21] StartMine
上面交互过程大概是:
1. 使用dotnet命令启动Miner.dll
2. 使用open wallet命令打开一个文件/miner_data/wallets/1.db3
3. 输入密码
4. 程序正常运行后马上输出StartMine等日志;如果密码错误,出现提示failed to open file "/miner_data/wallets/1.db3"
5. 步骤2、3也可能出现异常信息error,此时从步骤2重新执行即可。

由于我要把这段程序放在Docker生产环境中运行,所以要把这段人工交互过程改成程序自动交互的。初步研究后发现expect命令有这个功能,于是写了下面的一段代码a.sh:

代码: 全选

#!/usr/bin/expect

expect -c "
  spawn dotnet /miner/Miner.dll /rpc
  expect "ant\>"
  send "open wallet /miner_data/wallets/1.db3\r"
  expect "password:"
  send "1\r"
"
尝试运行这段代码,却发现结果不对:

代码: 全选

root@ffdf50d37cdd:/# sh a.sh
spawn dotnet /miner/Miner.dll /rpc
ant>couldn't read file "wallet": no such file or directory
root@ffdf50d37cdd:/# 
请教各位应该怎么写shell脚本呢?
头像
binbinxyz
帖子: 5
注册时间: 2012-03-19 10:42
送出感谢: 0
接收感谢: 0

Re: expect 怎么用?

#2

帖子 binbinxyz » 2016-10-23 15:18

我的问题就是一句话:我想用脚本完成代码一的人工交互过程,该怎么写?
头像
astolia
论坛版主
帖子: 3389
注册时间: 2008-09-18 13:11
送出感谢: 1 次
接收感谢: 569 次

Re: expect 怎么用?

#3

帖子 astolia » 2016-10-24 20:46

我的回答就是一句话:乱用引号就是这个结果,你先花点时间学一下基本的shell脚本语法再去挖矿吧
头像
vickycq
论坛版主
帖子: 4507
注册时间: 2011-03-20 13:12
系统: Debian
来自: 山东省寿光县
送出感谢: 100 次
接收感谢: 995 次
联系:

Re: expect 怎么用?

#4

帖子 vickycq » 2016-10-24 20:58

说个无关的,既然是 expect 脚本,脚本开头也使用了 #!/usr/bin/expect
下文直接撰写 expect 命令即可,不可再包括在 expect -c "" 中,可能带来引号嵌套未转义问题。
由于您使用 sh a.sh 运行脚本,开头的 #!/usr/bin/expect 毫无作用。a.sh 实际被当成 dash 脚本运行,部分抵消了脚本中使用 expect -c "" 带来的问题。
总体来看,犯了一连串错误。后犯的错误部分抵消了前面的错误,但仍未完全抵消,导致问题。
Debian 中文论坛 - forums.debiancn.org
欢迎所有 Debian GNU/Linux 用户
回复

回到 “Shell脚本”