我有一个bash脚本转储一些数据库并gz它们。然后它调用expect脚本,使用scp将文件传输到备份服务器(特别是为此目的创建的特定用户)。这是一个bash脚本:
backupbases.sh
文件:
#!/bin/bash
today=$(date +"%Y-%m-%d")
dumpPath=/home/mbackup/
remotePass=thereispassword
for db in $(mysql -e 'show databases' -s --skip-column-names); do
dbname=$db
if [ $dbname == "somedatabasename" ]; then
fname=$today"-mr1a-"$db".gz"
if [ -x $dumpPath$fname ]; then
rm $dumpPath$fname
fi
mysqldump $db | gzip -c > $dumpPath$fname
expect transfer.sh mbackup@server_address:/home/mbackup/$fname $dumpPath$fname $remotePass
#rm $dumpPath$fname
fi
done
tansfer.sh
文件:
#!/usr/bin/expect -f
# connect via scp
set remote [lindex $argv 0]
set localpath [lindex $argv 1]
set password [lindex $argv 2]
spawn scp $localpath "$remote"
#######################
expect {
-re ".*es.*o.*" {
exp_send "yes\r"
exp_continue
}
-re ".*sword.*" {
exp_send "$password\r"
}
}
expect eof
困扰我的一件事是密码以#
符号结束,可以将其解释为注释,但在控制台中调用backupbases.sh
会导致成功执行bash / expect。不幸的是,当crontab调用它时 - 只执行bash部分。转储数据库但不传输文件。当然,提供了密码和服务器地址。
如何解决?
答案 0 :(得分:1)
尝试将expect的输出记录到日志文件中,以便您可能知道它有什么问题。同时引用你的论点以防止与空格分裂。
( expect transfer.sh "mbackup@server_address:/home/mbackup/$fname" "$dumpPath$fname" "$remotePass"; ) >/path/to/log/file 2>&1
顺便提一下,我建议使用.exp
的文件扩展名代替期望脚本。