2011-03-02 20 views
0

我們目前有一個工作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正在使用引號並在不應該重定向的地方執行重定向,否則它會抱怨無效令牌(即括號)。

回答

2

這不是期望問題。這隻與殼牌報價有關。

您需要將那個長的mysqldump命令及其參數作爲單個「單詞」傳遞,因此您無法轉義外部引號。你可以使用單引號作爲外引號,所以你不必轉義內部的雙引號。

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'

====

更新:關於你的Tcl的一些注意事項(預計)的[lrange $argv 0 0]

    1. 使用[lindex $argv 0],而不是因爲你創建的MySqlCommand用括號發它作爲一個列表([lrange $argv 3 end]),但它應該是一個單一的字符串。現在您正在使用適當的shell引用,[lindex $argv 3]就足夠了,並解決了這個問題。如果您不通過它期望作爲一個參數,然後set remote_command [join [lrange $argv 3 end]]然後spawn $command $arg1 $arg2
  • +0

    謝謝。這讓我親密。我必須切換到使用bash而不是zsh,並且我必須調整我的期望腳本,因爲mysqldump命令是用大括號發送的。 – Nate 2011-03-02 20:41:48

    +1

    @Nate,我通過解答您的評論進行了更新。 – 2011-03-03 03:16:03

    +0

    請注意,在引號內,還可以添加換行符和製表符縮進以使其可讀。如果你真的瘋了,你可以在一個巨大的引號集中有一個200行的腳本(不是那總是一個好主意)。 – 2011-06-16 07:52:06