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

why does $ssh->exec(..) doesn't execute when we have dynamic variables as part of command

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

$起始值为“2015-07-27 18:48:56” $结束值为“2015-07-27 18:49:00”

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

简短的回答是你不能嵌套双引号和单引号字符串,这似乎是你在这里试图做的,并期望结果是 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因为PHP5.3,反正)。

  1. 双引号字符串
  2. 单引号字符串
  3. Heredoc
  4. 现在博士

Heredoc 和 Nowdoc 语法将分别产生与双引号和单引号字符串相同的最终结果。

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

注意事项

现在,假设您想要在字符串中使用文字双引号,您需要使用反斜杠 \ 转义字符来转义那些双引号。请参阅手册中的 escaping double quote strings

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