引用练习 - 如何在 ssh 中执行 ssh,同时在第二个 ssh 中运行 sql?

引用练习 - 如何在 ssh 中执行 ssh,同时在第二个 ssh 中运行 sql?

可能的重复:
在 ssh $host $FOO 和 ssh $host “sudo su user -c $FOO” 类型构造中引用
将包含单引号和双引号的命令包装到另一个命令中

我想从 php 通过 ssh 运行 sql 。下面的命令运行良好

ssh server1 "sudo -u db2inst1 sh -c '/opt/ibm/db2/V9.7/bin/db2 connect to RATIONAL; /opt/ibm/db2/V9.7/bin/db2 set schema Edumate; /opt/ibm/db2/V9.7/bin/db2 \"select * from edumate_settings\"'"

现在我需要从 server1 到 server2 进行 ssh,然后在那里运行“sudo -u db2inst1 ....”。

如果我向这种情况添加额外的服务器,是否有任何简单的方法可以处理报价?所以它会开始像

ssh server1 "ssh server2 "the rest is as above"

请注意,我需要从 php.ini 运行上面的代码。

答案1

您想要从command_with_argumentscommand "escaped_command_with_arguments"。您可以通过从左到右escaped_command_with_arguments扫描并将每个替换为和 每个替换为 来获得。command_with arguments\\\"\"

或者你放入command_with_arguments一个编辑器并

  1. 全部替换\\\
  2. 将每个替换"\"

按这个顺序。所以一步一步你可以生成以下表达式序列(我使用Windows记事本创建表达式)

select *
db2 "select *"
sudo "db2 \"select *\""
ssh "sudo \"db2 \\\"select *\\\"\""
ssh "ssh \"sudo \\\"db2 \\\\\\\"select *\\\\\\\"\\\"\""
ssh "ssh \"ssh \\\"sudo \\\\\\\"db2 \\\\\\\\\\\\\\\"select *\\\\\\\\\\\\\\\"\\\\\\\"\\\"\""
ssh "ssh \"ssh \\\"ssh \\\\\\\"sudo \\\\\\\\\\\\\\\"db2 \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"select *\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"\\\\\\\\\\\\\\\"\\\\\\\"\\\"\""

\如果计算最后一个表达式中每个之前的数量,"您将得到以下序列:

0 1 3 7 15 31 31 15 7 3 1 0

或者

1-1 2-1 4-1 8-1 16-1 32-1 32-1 16-1 8-1 4-1 2-1 1-1

因此,无需迭代即可一步构造这样的嵌套表达式,但必须注意表达式的嵌套方式。

这些方法还可以扩展到除了"和之外还有其他转义字符的情况\

因此,将您的命令放入编辑器中,替换server1server2,替换\\\"by \",如上所述,然后ssh server1 "在开头和"结尾处添加,您将得到

ssh server1 "ssh server2 \"sudo -u db2inst1 sh -c '/opt/ibm/db2/V9.7/bin/db2 connect to RATIONAL; /opt/ibm/db2/V9.7/bin/db2 set schema Edumate; /opt/ibm/db2/V9.7/bin/db2 \\\"select * from edumate_settings\\\"'\""

相关内容