如何通过带有Plink的SSH隧道发送多个命令,包括SQL查询?

问题描述

我正在尝试从Python脚本创建一个批处理文件,该脚本执行Plink以通过SSH将SQL查询发送到外部数据库。该脚本必须激活带有多个命令行的批处理文件才能发送到服务器。 在互联网上研究发现,一种类似于下面的代码解决方案应该可以解决问题。

(
    echo command 1
    echo command 2
    ...
) | plink.exe user@hostname -i sshkey.ppk

输入我的命令将产生以下结果:

(
    echo MysqL -u admin -pPassword Database
    echo INSERT INTO Table VALUES(DEFAULT,(SELECT ID FROM Another_Table WHERE Another_ID = 'foo'),'bar','foobar','date',1);
) | plink.exe user@hostname -i sshkey.ppk

我遇到的问题是,我收到以下错误:目前无法对'bar'进行语法处理。 (对不起,如果此处的翻译不正确,英语不是我的母语)。 我检查了是否必须转义某些特殊字符,但未找到任何确定性的答案。请注意,第一个命令是正确的,并且可以按预期工作。仅第二条命令似乎有故障。有人愿意为我提供解决方案吗?

解决方法

因此,这里的答案是,您不仅需要转义右括号TWICE,而且必须转义三个“ ^”字符。这是因为括号内的命令被解析了两次,第二个“ ^”需要转义才能进行第一次解析,因此需要第三个字符。

有关详细信息,请参见此处:Escaping parentheses within parentheses for batch file

代码因此如下所示:

(
    echo mysql -u admin -pPassword Database
    echo INSERT INTO Table VALUES(DEFAULT,(SELECT ID FROM Another_Table WHERE Another_ID = 'foo'^^^),'bar','foobar','date',1^^^);
) | plink.exe user@hostname -i sshkey.ppk