0

我正在使用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

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

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

谢谢你。

4

2 回答 2

2

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

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

请参阅Net::OpenSSH 文档中的Shell 引用

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

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

于 2012-10-15T20:26:57.407 回答
1

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

my $cmd = "mysql -e \"SET GLOBAL general_log_file = '$log'\"";
$ssh->system($cmd);
于 2012-10-15T14:45:01.467 回答