内联PHP(命令行)

时间:2012-04-05 08:42:02

标签: php shell terminal command-line-interface interpreter

我想制作像tryruby.org这样的东西。 我从用户那里拿了一行(例如echo __FILE__),我想用PHP执行它并将输出返回给客户端。

我尝试exec('php -r ' . $command, $output),但$output总是包含php帮助部分。

任何人都可以帮助我或提供如何实施此功能的建议。

很多。

4 个答案:

答案 0 :(得分:11)

要制作php -r,您必须在'代码之间放置要执行的代码.. '

示例:

php -r ' $var = 34; print_r($var); '

答案 1 :(得分:5)

看起来你的问题是你没有用' '包装代码来执行。您还需要警惕代码中的',特殊字符,转义序列等。

事实上,如果你坚持使用exec(),那么这样做可能会更好(完全避免担心转义等等):

$command = base64_encode($command);
exec("php -r 'eval(base64_decode(\"$command\"));'", $output);

可以使用eval()而不是你上面发布的内容。

此处的主要问题(包括eval()exec()代码)是从用户输入获取PHP代码并不安全

  

eval()语言构造 非常危险 ,因为它允许执行任意PHP代码。 因此不建议使用它。 如果您仔细确认除了使用此构造之外没有其他选择,请特别注意 不要传递任何用户提供数据 而未事先正确验证。


建议

由于您想要返回PHP代码的结果,您可以使用AJAX做一些很酷的事情,在这里您可以将PHP代码作为参数传递给脚本(可能是base 64编码):

$code = base64_decode($_GET['code']);
// clean the user input here
eval($code);

使用jQuery的AJAX示例:

// assuming `code` contains the PHP code
var encoded = base64_enc(code);

$.get('execute.php?code=' + encoded, function(data) {
    var result = new String(data);
    // do something with the result here, such as displaying it
}, dataType='text');

对于JavaScript中的base 64编码,see this

答案 2 :(得分:0)

查找'eval()',更重要的是,为什么eval()和你想要做的事情很难以安全的方式实现。成像例如输入的用户:

echo file_get_contents('/etc/passwd');

您需要做很多工作才能确保安全,包括观察和过滤从评估过程中进行的所有系统调用。

干杯

答案 3 :(得分:0)

http://tryruby.org似乎有一个交互式的Ruby shell。这似乎是一个很好的起点。

以下是为PHP提供此类shell的两个项目:php_replphpsh

另一部分是交互式shell的Web界面。对于那部分,我建议您查看repl.it,它为许多语言提供此服务(但遗憾的是不是PHP)。 Here's a link它的源代码。

通过这种组合,您应该能够完成cour项目。