0

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

如何解决?

4

1 回答 1

1

尝试将 expect 的输出记录到日志文件中,以便您可能知道它出了什么问题。还要很好地引用您的论点,以防止与空格分开。

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

顺便说一句,我建议使用文件扩展名来.exp代替期望脚本。

于 2013-09-24T08:10:02.700 回答