0

いくつかのデータベースをダンプして gz する bash スクリプトがあります。次に、scp (この目的のために特別に作成された特定のユーザー) を使用して、ファイルをバックアップ サーバーに転送する expect スクリプトを呼び出します。以下は 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

ちなみに、.expexpect スクリプトの代わりに のファイル名拡張子を使用することをお勧めします。

于 2013-09-24T08:10:02.700 に答える