2012-10-15 35 views
0

我使用Net::OpenSSH Perl模塊連接到SSH服務器並執行以下代碼:正確Perl中OpenSSH的模塊引用來解析MySQL命令

my @cmd = 'mysql -e "SET GLOBAL general_log_file = $log"'; 
$ssh->system(@cmd); 

這裏是正確的shell命令:

mysql -e "SET GLOBAL general_log_file = 'log_name'" 

我收到以下錯誤:

ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 

你看到我的問題是如何正確解析變量。

請幫我改正引文嗎?我已經嘗試了所有可能的變體。

謝謝。

回答

1

你的cmd應該被定義爲一個標量,而不是一個列表。既然你是在字符串中替換$log,你應該用雙引號開單引號內包裝爲MySQL:

my $cmd = "mysql -e \"SET GLOBAL general_log_file = '$log'\""; 
$ssh->system($cmd); 
+0

謝謝你的幫助。 – Andrew

2

您應該使用一個列表,而不是標量,不像答案1的建議,但它不應該是一個元素的數組。

my @cmd = (mysql => '-e', "SET GLOBAL general_log_file = '$log'"); 
$ssh->system(@cmd); 

在Net :: OpenSSH文檔中參見Shell Quoting

注意,這個假設$日誌變量不包含特殊含義的任何字符到SQL,像

尋找一種方法來連接到與DBI(你的MySQL服務器可能使用的Net :: OpenSSH的opentunnel),並使用一個佔位符準備好的語句來運行這個命令會更好。