在Perl OpenSSH模块中正确引用以解析MySQL命令

时间:2012-10-15 14:37:24

标签: perl

我正在使用Net::OpenSSH Perl模块连接到SSH服务器并执行以下代码:

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

您看到我的问题是如何正确解析变量。

你可以帮我纠正引用吗?我已经尝试了所有可能的变种。

谢谢。

2 个答案:

答案 0 :(得分:2)

与答案1的建议不同,你应该使用列表而不是标量,但它不应该是一个元素的数组。

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

请参阅Net :: OpenSSH文档中的Shell Quoting

请注意,这假定$ log变量不包含任何对SQL有特殊含义的字符,例如'

找到一种使用DBI连接到Mysql服务器的方法(可能使用Net :: OpenSSH的opentunnel)并使用带有占位符的准备好的语句来运行此命令会更好。

答案 1 :(得分:1)

你的cmd应该被真正定义为标量,而不是列表。由于你要替换字符串中的$log,你应该用双引号打开并用mysql的单引号括起来:

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