【问题标题】:php exec: bad php backslash escaping or what?php exec:糟糕的 php 反斜杠转义还是什么?
【发布时间】:2012-01-30 16:31:58
【问题描述】:

我有这个命令:

exec(sprintf('%s %s dump_data output', escapeshellarg($apps . 'pdftk' . DIRECTORY_SEPARATOR . 'pdftk.exe'), escapeshellarg(self::winEscapeShellArgFix($file, array()))), $output);

sprintf 的结果是这样的:

"\\127.0.0.1\binary\win32\pdftk\pdftk.exe" "//127.0.0.1/uploads\1-16knje01g1drjagii61j3515a94.pdf" dump_data output

从 exec 运行此命令不会产生任何结果,但如果我从 windows cmd 运行它,它将正常工作。在我尝试了数百万条命令后,我了解到问题在于 php 将 sprintf 输出中的反斜杠用作转义反斜杠:

**\\**127......

有人知道为什么会这样吗?我关闭了所有魔法。

编辑: 如果我会执行:

exec("\\127.0.0.1\binary\win32\pdftk\pdftk.exe //127.0.0.1/uploads\1-16knje01g1drjagii61j3515a94.pdf dump_data output",$outarr);

exec('\\127.0.0.1\binary\win32\pdftk\pdftk.exe //127.0.0.1/uploads\1-16knje01g1drjagii61j3515a94.pdf dump_data output',$outarr);

它不会起作用

EDIT2: 我调试,这不是一个转义问题,命令实际上很好,它似乎是一个执行问题,即没有返回输出。它可以在 iis 网络服务器中运行,但不能在另一个 iis 网络服务器中运行。

【问题讨论】:

  • 请改写您的诊断。我不太明白“php 将 sprintf 输出中的反斜杠用作转义反斜杠。”谢谢!
  • "\\" 是网络共享的合适开头。你是说你只想要一个“\”?
  • 是的,我想指向一个网络共享,但 "\\" 不起作用:结果是 \127.0.0.1,我不希望这样,即使我正在使用 escapeshellchars

标签: php escaping exec


【解决方案1】:

albanx,这不是 sprintf 对你做的,它是 escapeshellarg 添加反斜杠。 http://php.net/manual/en/function.escapeshellarg.php

【讨论】:

  • 问题不是添加,而是删除,escapeshellarg 在实践中应该保留它们
  • 我刚刚注意到一些我以前没有看到的东西,你在参数中有一个“斜线不匹配”。你在这里有相反的斜线:“/uploads\”。我从来没有使用过 pdftk,但我敢肯定你不能同时使用斜线。我不确定 winEscapeShellArgFix 修复是什么,但接下来我会检查那里。
  • php 有点奇怪,它似乎把 \\ 作为 \ 的转义,即使它在字符串中
  • 啊,我明白了。你试过4次反弹吗?理论上它会在 2 个真正的斜线处看到它并通过。
  • 是的,我可以通过这种方式解决,但问题是这个 \\127.0.0.1\binary\win32\pdftk\pdftk.exe 在一个变量中,实际上我有 'exec(" $pdftkpath $pdffile dump_data output",$outarr);'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-14
  • 2021-11-16
  • 2014-09-07
  • 2012-07-23
  • 2015-02-02
  • 1970-01-01
相关资源
最近更新 更多