如何从 laravel 控制器执行外部 shell 命令?
Posted
技术标签:
【中文标题】如何从 laravel 控制器执行外部 shell 命令?【英文标题】:How to execute external shell commands from laravel controller? 【发布时间】:2019-01-19 10:14:38 【问题描述】:我需要从控制器执行 shell 命令,但不仅仅针对项目中的文件,例如。 system('rm /var/www/html/test.html') 或 system('sudo unzip /var/www/html/test.zip');
我调用了该函数,但没有任何反应,知道如何从控制器执行外部 shell 命令,例如删除另一个目录中的一个文件吗?
system('rm /var/www/html/test.html');
//or
exec('rm /var/www/html/test.html')
【问题讨论】:
【参考方案1】:如果您想从 php 应用程序运行命令,我建议您使用 Symfony Process Component:
运行composer require symfony/process
使用use Symfony\Component\Process\Process;
将类导入到您的文件中
执行你的命令:
$process = new Process(['rm', '/var/www/html/test.html']);
$process->run();
如果你使用 Laravel,你应该可以跳过第 1 步。
或者,(如果运行 php 的进程具有正确的权限)您可以简单地使用 PHP 的 unlink() 函数来删除文件:
unlink('/var/www/html/test.html');
【讨论】:
我试过了,但是 Symfony Process 只在项目目录中执行命令,当我执行 $process = new Process(['rm', '/var/www/another_directory/test.html']) 时,它不执行 @AnonS 在那种情况下,我想你有权限问题。您使用的是什么操作系统? 我正在使用 linux 你是对的,这是权限问题,我给了它 755 和 www-data,它就像魅力一样,谢谢 你不需要安装它,它已经包含在 Laravel 中。见***.com/a/27857423/135101。【参考方案2】:我会用框架已经提供的东西来做这个:
1) 首先生成一个命令类:
php artisan make:command TestClean
这将在 App\Console\Commands 中生成一个命令类
然后在那个命令类的句柄方法里面写:
@unlink('/var/www/html/test.html');
给你的命令一个名字和描述然后运行:
php artisan list
只是为了确认您的命令已列出。
2) 在您的控制器中导入 Artisan 外观。
use Artisan;
3) 在您的控制器中,然后编写以下内容:
Artisan::call('test:clean');
请参阅文档以了解更多用途: https://laravel.com/docs/5.7/artisan#generating-commands
【讨论】:
这对我的情况不起作用,无论如何谢谢,很好的解决方案 @AnonS 我想罗斯提到它是一个权限问题,也许你应该简单地检查你从exec('rm /var/www/html/test.html', $output); var_dump($output);
得到的输出并与我们分享
输出为空
我的错应该是exec('rm /var/www/html/test.html 2>&1', $output); var_dump($output);
以上是关于如何从 laravel 控制器执行外部 shell 命令?的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 4 使用数据从控制器向外部 url 发出 post 请求