macellan/l5shell

L5shell - 为 Laravel 5.* 添加 shell 命令包装器

1.4.2 2019-09-07 20:34 UTC

This package is auto-updated.

Last update: 2024-09-08 07:48:36 UTC


README

此 Laravel 4 包是 简单 shell 命令包装器类的另一个分支。它允许您在不丢失编写单元测试能力的情况下将 exec() 命令添加到您的应用程序中。该包附带一个 Facade,因此使用 Mockery 进行测试变得非常简单。

此包在 Windows 系统上无法使用。

新增功能

此分支仅添加了 runBackground() 方法。请谨慎使用,这可能不适合您。

安装

简单地使用 composer

$ php composer.phar require iyank4/l4shell:1.2.2

或将要求手动添加到 composer.json 文件中

"require": {
     "iyank4/l4shell": "1.2.2"
}

包成功加载后,您必须将其添加到 Service Providers 数组中

// app/config/app.php
'providers' => array(
	...
	'Netson\L4shell\L4shellServiceProvider',
);

服务提供程序会自动注册别名,但以防您想知道,这是它

'L4shell' => 'Netson\L4shell\Facades\Command'

用法

此包对整个命令(使用 escapeshellcmd())和每个单独的参数(使用 escapdeshellarg())进行转义。几乎所有方法都允许对象链,以便轻松设置。

初始化新命令

这可以通过在服务提供程序中注册的快捷方式来完成

$command = L4shell::get();

或通过手动创建新对象

$command = new \Netson\L4shell\Command("command", array("arg1", "arg2"));

使用 get() 方法将初始化一个空的命令对象,您必须在执行命令之前使用 setCommand() 和 setArguments() 方法(可选)。

示例命令:不带参数

$command = L4shell::get();
$result = $command->setCommand('hostname')->execute();

如果命令执行成功,将返回命令的输出。如果命令无法执行,将抛出异常,包括命令的错误消息(除使用 sendToDevNull() 方法外;见下文)。

示例命令:带有参数

添加参数时,请确保添加正确数量的占位符(sprintf 格式),否则将抛出异常。

$command = L4shell::get();
$result = $command->setCommand('hostname %s')->setArguments(array("-s"))->execute();

默认情况下,当您调用 setArguments() 方法时,任何现有参数都将被替换,以避免在一系列连续命令中堆叠参数。但是,如果您想分几个步骤添加它们,可以通过传递第二个(可选)布尔参数到该方法来实现。

$command = L4shell::get();
$command->setCommand('ls %s %s')->setArguments(array("-a"));
// do something else ...
$command->setArguments(array("-l"), true); // add the optional second argument to keep existing arguments
$result = $command->execute();

如果您想手动清除任何现有参数,请使用以下方法

$command = L4shell::get();
$command->clearArguments();

示例命令:将输出发送到 /dev/null

此包有简单的方法将命令输出发送到 /dev/null,因为您可能只对退出状态感兴趣,而不是输出文本。将输出发送到 /dev/null 将使任何输出消息变得无用,但退出代码当然仍然可用,当发生错误时将抛出异常。

$command = L4shell::get();
$result = $command->setCommand("hostname")->sendToDevNull()->execute(); // will return exit code (0), but no output message

示例命令:启用所有命令的日志记录

L4shell 允许您轻松地将所有对 shell 命令的调用记录到默认的 Laravel 日志。默认情况下,日志记录是 启用的。日志记录使用默认的 Laravel 4 日志包(Monolog)。

对于每个成功的命令,将出现 3 或 4 行日志,具体取决于是否设置了参数

  • 设置命令 ...
  • 设置参数 ...(可选)
  • 执行命令 ...
  • 命令成功执行

要禁用日志记录,发布包配置文件

$ php artisan config:publish iyank4/l4shell

然后更改 enable_logging 选项,位于文件 app/config/packages/iyank4/l4shell/config.php 中。

或者,您可以在运行时更改日志设置

$command = L4shell::get();
$result = $command->setLogging(true)->setCommand("hostname")->execute();

设置和取消设置执行路径

如果您想在特定目录内执行命令,可以使用以下方法

$command = L4shell::get();
$result = $command->setExecutionPath("/path/to/your/folder")->setCommand("ls")->execute();

执行路径是一个静态变量,这意味着在这种情况下,如果只设置一次执行路径,将会影响之后执行的所有命令。

注意: 执行路径在执行命令之前更改,并在命令执行后立即恢复到原始设置。这样您就不必记住还原工作目录,并且不会干扰在此之后运行的任何脚本。

如果您想取消设置执行路径,只需调用该方法而不带任何参数

$command = L4shell::get();
$result = $command->setExecutionPath()->setCommand("ls")->execute();

设置和取消设置可执行路径

如果包含您的可执行文件的文件夹不在执行命令的用户路径中,您可以使用以下方法

$command = L4shell::get();
$result = $command->setExecutablePath("/usr/bin")->setCommand("ls")->execute();

这将有效地将您的命令从简单的 $ ls 更改为 $ /usr/bin/ls。这也是一个静态变量,这意味着设置将跨命令持久化。

如果您想取消设置可执行路径(例如,要从本地目录运行命令),只需调用该方法不带任何参数

$command = L4shell::get();
$result = $command->setExecutablePath()->setCommand("ls")->execute();

防止某些字符被转义

当您有一个需要使用通常会被 escapeshellcmd()escapeshellarg() 函数转义的特定shell命令时,您可以使用 setAllowedCharacters() 方法。此方法接受一个数组,这些字符不会被 L4shell 转义

$command = L4shell::setCommand('find ./ -maxdepth 1 -name %s')->setArguments(array("*.txt"))->setAllowedCharacters(array("*"));
// returned with allowed characters: find ./ -maxdepth 1 -name '*.txt'
// returned without allowed characters: find ./ -maxdepth 1 -name '\*.txt'

由于此方法完全绕过了可能危险字符的转义,请务必小心使用此方法!!

单元测试

当使用 L4shell 时,对模块/包进行单元测试很容易。只需在测试中使用 Mockery 风格的调用即可

public function testSomething ()
{
    L4shell::shouldReceive('get')->once();
    L4shell::shouldReceive('execute')->once()->andReturn("your message");
}
public function tearDown ()
{
    \Mockery::close();
}

有关使用 Laravel 4 进行单元测试的更多信息,请查看以下文档