我正在使用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
您看到我的问题是如何正确解析变量。
你可以帮我纠正引用吗?我已经尝试了所有可能的变种。谢谢。
答案 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);