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