我应该如何正确地逃避这个字符串?

时间:2014-09-20 02:42:51

标签: php unix

我尝试使用shell_execexec proc_open来编译Sass(.scss)文件的内容。不要问我为什么不直接传递文件或使用proc_open,这里的目标是通过stdin传递内容,用echo传送。

我认为字符串中有一些字符会破坏命令,但我无法弄清楚哪个字符。我在Ubuntu 14.04上运行PHP 5.6,在这种情况下运行CLI。

你可以运行它来亲眼看看(需要安装Ruby和Sass):

sudo apt-get install Ruby&& sudo gem install sass

<?php

/** Should work with '$large = true' and '$download = false' **/

// to prove that a small file DOES compile via stdin
$large = true;

// to prove that it's compilable as a file, rather than stdin
$download = false;

$domain = "http://test.fhmp.net";
$file = $large ? 'large' : 'small';

// grab a valid .scss file
$input = file_get_contents("$domain/$file.scss");

if($download){

    // create temp file
    $temp = tempnam(sys_get_temp_dir(), '');
    file_put_contents($temp, $input);

    // compile temp file
    var_dump(shell_exec("sass --scss '$temp' 2>&1"));

    // delete temp file
    @unlink($temp);

} else {

    // attempt to escape it
    $esc = escapeshellarg($input);

    // dump the results of the shell call
    var_dump(shell_exec("echo $esc | sass --scss --stdin 2>&1"));
}

2 个答案:

答案 0 :(得分:0)

你应该尝试:

$ esc =&#39; $&#39; .escapeshellarg($ input);

escapeshellarg()函数使用反斜杠转义单引号,这意味着: escapeshellarg("//where's the quote")成为'where\'s the quote'。你不能在(bash)shell中的单引号内回显单引号,请参阅:How to escape a single quote in single quote string in Bash?

答案 1 :(得分:0)

我认为这里的问题是当我对整个输入字符串进行插值时,命令太长了。解决方案是使用proc_openpopen使用|写入标准输入而不是管道。