【发布时间】:2011-07-07 08:52:51
【问题描述】:
我们目前有一个可用的 ant 脚本,它将使用 mysqldump 将远程服务器上的数据库转储到该远程服务器上的文件中。我们使用 ant 的 exec 任务运行一个期望脚本来 ssh 到远程机器并运行 mysqldump 命令。我正在尝试更新命令以将转储限制为仅包含不到 3 个月的数据。我遇到了令人讨厌的引号和括号转义问题。
这是我正在尝试使用的命令行:
expect -f ssh-pass.exp <SERVER_PASSWD> ssh <USER>@<IP_ADDRESS> \"mysqldump -h localhost -u user --password=passwd staging --where=\"createTimeFi > now() - interval 3 month\" --ignore-table=staging.JMS_MESSAGES --ignore-table=staging.JMS_ROLES --ignore-table=staging.JMS_SUBSCRIPTIONS --ignore-table=staging.JMS_TRANSACTIONS --ignore-table=staging.JMS_USERS --ignore-table=staging.TIMERS > dump.sql\"
这里是期望脚本:
set password [lrange $argv 0 0]
set command [lrange $argv 1 1]
set arg1 [lrange $argv 2 2]
set arg2 [lrange $argv 3 end]
puts "command: $command"
puts "arg1: $arg1"
puts "arg2: $arg2"
set timeout -1
spawn $command $arg1 "$arg2"
match_max 100000
expect "*?assword:*"
puts "\rsending password..."
send -- "$password\r"
puts "\r**************** Running remote command, wait... ******************"
expect eof
我尝试了 ssh 命令和 mysqldump 的 where 参数的各种转义引号组合,但均未成功。有时expect会抱怨“interval”是一个未知的命令。有时在我的本地机器上,该命令会创建名为“now”或“dump.sql”的文件,这似乎表明我的本地 shell 正在吃引号并在不应该的地方进行重定向,否则它会抱怨无效令牌(即括号)。
【问题讨论】:
标签: shell ant ssh mysqldump expect