我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

本文介绍php执行命令行的几个函数,就服务器安全角度来说,这几个命令都属于邪恶函数的范畴。正常情况下来说,这些函数是会被禁止执行的。在极个别的情况下,这些函数也有使用的场景,比如和其它程序通过命令行进行交互。本文就是基于这种使用场景为前提的。

苏南大叔:php如何执行命令行?有服务器执行权限的邪恶函数对比 - php邪恶函数对比
php如何执行命令行?有服务器执行权限的邪恶函数对比(图8-1)

大家好,这里是苏南大叔的程序如此灵动博客,记录苏南大叔和计算机代码的故事。在本文中,讲对于具有服务器端执行命令权限的几个php函数的区别。测试环境:win10php@php7.4.29nts。本文例子的具体需求事项是:使用php在服务器端执行python程序。

开启和禁用(disable_functions)

首先需要特别明确的是:本文中涉及的函数,理论上来说都是属于危险函数,属于被禁用的范畴。配置的方式是:修改php.ini中的disable_functions

disable_functions = passthru,exec,system,chroot,chgrp,chown,popen,proc_open,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,shell_exec

苏南大叔:php如何执行命令行?有服务器执行权限的邪恶函数对比 - 禁用函数的方式
php如何执行命令行?有服务器执行权限的邪恶函数对比(图8-2)

参考文章:

因为本文中,就是用来对比相关的函数的。所以,本文的测试环境中必然已经启用了相关函数。主要涉及的函数有:passthru()exec()shell_exec()

passthru()

passthru的最大特点是:直接把被执行命令的输出,显示出来。意思就是不用echo,不用return

范例如下:

$command = "chdir";
passthru($command);

输出界面截图:

苏南大叔:php如何执行命令行?有服务器执行权限的邪恶函数对比 - passthru
php如何执行命令行?有服务器执行权限的邪恶函数对比(图8-3)

如果想对它的返回值进行修改,那么可能需要ob_start()ob_end_flush(),留待后续讨论。

exec()

exec则是将命令行的返回值,输出到第二个参数中。

$command = "chdir";
exec($command, $result);
print_r($result);

苏南大叔:php如何执行命令行?有服务器执行权限的邪恶函数对比 - exec
php如何执行命令行?有服务器执行权限的邪恶函数对比(图8-4)

shell_exec()

shell_exec()则是执行返回命令执行的结果。

$command = "chdir";
echo shell_exec($command);

苏南大叔:php如何执行命令行?有服务器执行权限的邪恶函数对比 - shell_exec
php如何执行命令行?有服务器执行权限的邪恶函数对比(图8-5)

这个重音符形式的命令执行方式,还是防不胜防。对比下面两条语句的执行结果:

$command = "chdir";
echo $command;
echo `${command}`;
echo `$command`;

都被直接执行输出了!这种写法在js语言中,有过讨论。参考文章:

但是,这种重音符的写法等同于shell_exec()。所以禁用shell_exec()函数后,上述代码也会报错:

Warning: shell_exec() has been disabled for security reasons。

可能存在的问题

下面是几个可能存在的问题,及解决方案。

中文乱码

在这里,中文乱码的解决方案居然不是utf8,而是gbk2312。多少有些令人意外。

header("content-type:text/html;charset=gbk2312");
//...

苏南大叔:php如何执行命令行?有服务器执行权限的邪恶函数对比 - 中文乱码
php如何执行命令行?有服务器执行权限的邪恶函数对比(图8-6)

执行超时

个别命令可能会超时,可能需要下面的命令:

@set_time_limit(0);
//...

没有输出

直接运行命令正常,但是在php里面调用,就死活没有输出。那么,不妨试试增加了一下管道流命令2>&1

$command = "test.py";
passthru($command);
$command = "test.py 2>&1";
passthru($command);

苏南大叔:php如何执行命令行?有服务器执行权限的邪恶函数对比 - 管道流输出
php如何执行命令行?有服务器执行权限的邪恶函数对比(图8-7)

找不到命令

直接运行命令正常,但是在php里面调用,就是无法找到对应的命令。那么,不妨试试绝对路径。

$command = "python test.py 2>&1";
passthru($command);
$command = '"D:\\Program Files\\Python368\\python.exe" test.py 2>&1';
passthru($command);

苏南大叔:php如何执行命令行?有服务器执行权限的邪恶函数对比 - 绝对路径
php如何执行命令行?有服务器执行权限的邪恶函数对比(图8-8)

相关链接

总结

更多来自苏南大叔的php文章,请点击:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   php