当我们将动态变量作为命令的一部分时,为什么$ ssh-> exec(..)不会执行

时间:2015-07-28 00:11:51

标签: phpseclib

当我将值传递为$ start&时,我无法运行以下命令$ end但是当我直接给出日期值时它会成功运行。还有其他运行命令的方法吗? 注意:我正在使用phpseclib并能够成功登录并执行基本命令。

$起始值是“2015-07-27 18:48:56” $ end value是“2015-07-27 18:49:00”

{{1}}

1 个答案:

答案 0 :(得分:3)

简短的回答是你不能嵌套双引号和单引号字符串,这似乎是你在这里尝试做的,并期望结果是PHP将你的变量扩展到字符串中。一旦字符串语法以单引号开头,字符串内的字符就不会被扩展(重新评估),这与双引号不同。因此,单引号字符串中的双引号仍然只是一个双字引号。

而是使用echo $ssh->exec("/tpo/umc/bin/cmu_monitoring_dump -n r02bv01 -m cpunumber -t0 $start -t1 $end -f line> /tmp/adwant.txt");

长答案

在PHP中有4 main syntax for strings(自PHP 5.3以来,无论如何)。

  1. 双引号字符串
  2. 单引号字符串
  3. 定界符
  4. Nowdoc
  5. Heredoc和Nowdoc语法将分别产生与双引号和单引号字符串相同的净结果。

    单引号和双引号字符串之间的唯一区别是单引号字符串不提供string interpolation并且只有一个转义序列字符(单引号本身)。也就是说,当你创建一个像'some $string here'这样的字符串时,它将成为开始和结束单引号之间每个字符的字符串文字,没有其他字符可以在字符串中展开。同样的事情也适用于 Nowdoc 字符串语法。

    注意事项

    现在,假设您需要字符串中的文字双引号,则需要转义具有反斜杠\转义字符的字符。请参阅手册中的escaping double quote strings

    您还应该注意,在PHP的字符串解析之外,双引号和单引号之间的某些shell也存在差异,并且这些shell也可能具有不同的转义序列字符(有关更多信息,请参阅escapeshellarg详情)。