如何从 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 Artisan 控制台运行外部命令

Laravel 4 使用数据从控制器向外部 url 发出 post 请求

Laravel 为外部用户登录成功设置会话或令牌 - 无用户仅数据库 Api 用户

什么是shell

如何从 Vim 中访问 shell 或者运行外部命令

如何使用Laravel命令执行外部PHP脚本?