调用在crontab中执行期望的bash脚本

时间:2013-09-24 08:06:12

标签: bash ubuntu crontab expect

我有一个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部分。转储数据库但不传输文件。当然,提供了密码和服务器地址。

如何解决?

1 个答案:

答案 0 :(得分:1)

尝试将expect的输出记录到日志文件中,以便您可能知道它有什么问题。同时引用你的论点以防止与空格分裂。

( expect transfer.sh "mbackup@server_address:/home/mbackup/$fname" "$dumpPath$fname" "$remotePass"; ) >/path/to/log/file 2>&1

顺便提一下,我建议使用.exp的文件扩展名代替期望脚本。