PHP 将带撇号的字符串传递给 shell_exec

Dan*_*Dan 2 php exec shell-exec

I\xe2\x80\x99m 尝试通过 PHP 将字符串(从 PDO 查询提取到 MYSQL DB)传递shell_exec到 *nix 程序,在本例中为xtide

\n\n

一切正常,直到我传递一个包含撇号的字符串。

\n\n

这适用于 OSX 上的终端:

\n\n
house@New-MacBook-Pro:~$ tide -l "Nomans Land, Martha\'s Vineyard, Massachusetts"\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是完全相同的字符串,从 PDO 查询到 MYSQL DB,并作为变量传递到 shell_exec 中,总是会失败。我如何排列单引号/双引号似乎并不重要。

\n\n

运行此命令会添加反斜杠,但仍然失败:

\n\n
$tideLocation = mysql_real_escape_string($tideLocation);\n
Run Code Online (Sandbox Code Playgroud)\n\n

输出:

\n\n
Nomans Land, Martha\\\xe2\x80\x99s Vineyard, Massachusetts\n
Run Code Online (Sandbox Code Playgroud)\n\n

失败:

\n\n
$output1 = shell_exec("/opt/local/bin/tide -l \'Nomans Land, Martha\'s Vineyard, Massachusetts\'");\n\n$output1 = shell_exec("/opt/local/bin/tide -l \'$tideLocation\'");\n
Run Code Online (Sandbox Code Playgroud)\n\n

当在以下位置手动设置时,这是有效的shell_exec

\n\n
$output1 = shell_exec("/opt/local/bin/tide -l \'Nomans Land, Martha\\\'s Vineyard, Massachusetts\'");\n
Run Code Online (Sandbox Code Playgroud)\n\n

非常欢迎建议。

\n

Ale*_*ara 5

用于escapeshellarg正确转义命令行参数的单引号中的字符串。

例子:

$command = '/opt/local/bin/tide -l ' . escapeshellarg($tideLocation);
shell_exec($command);
Run Code Online (Sandbox Code Playgroud)