可能的重复:
在 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_arguments
到
command "escaped_command_with_arguments"
。您可以通过从左到右escaped_command_with_arguments
扫描并将每个替换为和 每个替换为 来获得。command_with arguments
\
\\
"
\"
或者你放入command_with_arguments
一个编辑器并
- 全部替换
\
为\\
- 将每个替换
"
为\"
按这个顺序。所以一步一步你可以生成以下表达式序列(我使用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
因此,无需迭代即可一步构造这样的嵌套表达式,但必须注意表达式的嵌套方式。
这些方法还可以扩展到除了"
和之外还有其他转义字符的情况\
。
因此,将您的命令放入编辑器中,替换server1
为server2
,替换\
为\\
和"
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\\\"'\""