这个expect脚本问题出现在哪里呢?

下面的脚本的目的是ssh连接远程服务器,执行dump命令,将数据库dump为sql文件,并且压缩为zip文件。

echo ' dump 数据 并 zip '
/usr/bin/expect << eof
spawn ssh root@xxx.xxx.xxx.xxx
expect "root@*"  {send "mysqldump -uuser -h localhost -ppwd db_name  > /db_name.sql \r"}
expect "root@*"  {send "zip db_dump_file.zip db_name.sql \r"}
expect "root@*"  {send "exit \r"}
eof
echo done!

输出结果为:

[root@localhost ~]# mysqldump -uuser -h localhost -ppwd db_name  > /db_name.sql
Warning: Using a password on the command line interface can be insecure.
mysqldump: Error: 'Access denied; you need (at least one of) the PROCESS privilege(s) for this operation' when trying to dump tablespaces

结果是mysqldump命令执行了,但是zip命令未能执行。从输出来看dump命令输出了一个warning和一个error我尝试将脚本修改为如下内容(添加了两行Warning、mysqldump的expect)但是未能解决问题。

echo ' dump 数据 并 zip '
/usr/bin/expect << eof
spawn ssh root@xxx.xxx.xxx.xxx
expect "root@*"  {send "mysqldump -uuser -h localhost -ppwd db_name  > /db_name.sql \r"}
expect "Warning*"  {send " "}
expect "mysqldump*"  {send " "}
expect "root@*"  {send "zip db_dump_file.zip db_name.sql \r"}
expect "root@*"  {send "exit \r"}
eof
echo done!

请问为何压缩命令没有执行呢?

阅读 699
1 个回答

已解决问题。

  1. send 命令放在大括号中执行是异步的,需要拿出来。
  2. 命令执行默认有超时时间,需要设置为不超时。

修改后如下:

echo ' dump 数据 并 zip '
/usr/bin/expect << eof
set timeout -1
spawn ssh root@xxx.xxx.xxx.xxx
expect "root@*"  
send "mysqldump -uuser -h localhost -ppwd db_name  > /db_name.sql \r"
expect "root@*"  
send "zip db_dump_file.zip db_name.sql \r"
expect "root@*"  
send "exit \r"
eof
echo done!
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进