通过php中的ssh2_exec在sed命令中转义行情

时间:2012-12-23 16:47:59

标签: php sed libssh2

我正在尝试在php中使用以下命令发送到我的服务器:

ssh2_exec($con,  'sed -i \'s/max-players=4/max-players=8/g\' ' . $filedir . '\'/server.properties')

但它没有做任何事情。另一方面,这个命令:

ssh2_exec($con, 'sed -i \'s/max-players=4/max-players=12/g\' /home/servers2/\'' . $mUsername . '\'/server.properties')

工作正常,我正在尝试从硬编码的dir转换为db的dir。所以

$filedir = $DIR . $mUsername;
在这种情况下,

$Dir'/home/servers2/'$mUsername可为Testing540

当我打印$filedir的值时,我得到了:

/home/servers2/Testing540

我的引号是否在第一个代码段中直接转义?

2 个答案:

答案 0 :(得分:1)

关于正确引用的问题很难回答,因为您没有创建可以轻松调试的内容。请考虑以下代码:

$pattern = 'sed -i \'s/max-players=4/max-players=8/g\' %s\'/server.properties';
$command = sprintf($pattern, $filedir);
$result  = ssh2_exec($con,  $command);

然后您可以更轻松地验证您的实际命令,例如通过检查/输出/记录:$command

此外,您可以更轻松地比较两种变体之间的区别。

同时启用错误报告并记录到最高级别,您可能只会遇到未定义变量$DIR的问题:

  

注意:未定义的变量:DIR in ...

这将使您的第一个命令失败,因为那时没有这样的路径/文件。这很可能是你的问题。

小心。

答案 1 :(得分:0)

原来问题出在行尾。我将其更改为:

ssh2_exec($con,  'sed -i \'s/max-players=4/max-players=8/g\' ' . $filedir . '/server.properties')

效果很好。我必须在\'

之前取出/server.properties'