我們目前有一個工作ant腳本,它將使用mysqldump將遠程服務器上的數據庫轉儲到該遠程服務器上的文件。我們使用ant的exec任務來運行一個期望腳本ssh到遠程機器並運行mysqldump命令。我試圖更新命令來限制轉儲只包含少於3個月的數據。我遇到了惱人的引用和parens轉義問題。當使用expect,ssh,ant和mysqldump時,正確地轉義引號和parens
這裏是我試圖讓工作在命令行:
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參數沒有成功。有時候期望會抱怨「間隔」是一個未知的命令。有時候在我的本地機器上,命令會創建名爲「now」或「dump.sql」的文件,這些文件似乎表明我的本地shell正在使用引號並在不應該重定向的地方執行重定向,否則它會抱怨無效令牌(即括號)。
謝謝。這讓我親密。我必須切換到使用bash而不是zsh,並且我必須調整我的期望腳本,因爲mysqldump命令是用大括號發送的。 – Nate 2011-03-02 20:41:48
@Nate,我通過解答您的評論進行了更新。 – 2011-03-03 03:16:03
請注意,在引號內,還可以添加換行符和製表符縮進以使其可讀。如果你真的瘋了,你可以在一個巨大的引號集中有一個200行的腳本(不是那總是一個好主意)。 – 2011-06-16 07:52:06