aariow/artisan-api

通过 REST API 和 HTTP 请求安全执行 Laravel Artisan 命令。

安装: 7

依赖者: 0

建议者: 0

安全性: 0

星标: 12

关注者: 1

分支: 1

开放问题: 1

类型:项目

v1.2.1-beta 2022-08-20 10:29 UTC

This package is auto-updated.

Last update: 2024-09-26 10:46:30 UTC


README

Artisan Api

通过 HTTP 执行 Artisan 命令

Packagist PHP Version Support GitHub Packagist Version Packagist Downloads GitHub all releases GitHub repo size

Linkedin URL

有时候你可能想执行 Artisan 命令,但没有访问 shell 或 SSH。这里我们为你带来了 REST API 解决方案。

你可以通过 REST API 轻松运行 Artisan 命令。

'README.md 需要更新'

目录

入门

要使用此包,您应该将其与 Laravel v9.21 和 PHP v8.0 或更高版本一起安装。

您可以通过 Composer 包管理器 安装它

composer require aariow/artisan-api --dev

尽管 Artisan-Api 本身具有生产检测器,但您也可以将其全局安装。

端点

正如其名所示,所有命令都可通过 HTTP 的 POST 方法访问。所有命令都将作为路由生成并集成到 Laravel 路由系统中。您只需要发送一个 POST 请求并遵循签名,就像其他 REST API 端点一样。

有两种类型的命令;一种是正常命令,如 php artisan listphp artisan cache:clear,另一种是 GeneratorCommands,它们倾向于在您的应用程序中创建文件,如 make:modelmake:migration。这些命令有不同的目的,您应该遵循不同的约定。

GeneratorCommandIlluminate\Console\GeneratorCommand 的实例,它扩展了 Illuminate\Console\Command 类。

默认存在的所有命令或您创建的命令都将自动发现,您无需手动操作。因此,它们的端点将动态生成到您的应用程序中。因此,如果您删除/添加任何命令类,无需担心。

路由

让我们深入了解使用端点

路由的生成格式如下

https://domain.com/artisan/api/{command}/{subcommand}?args=key1:value1,key2:value2&options=opt1:value1,opt2


因此,上述端点将转换为

php artisan command:subcommand value1 value2 --opt1=value1 --opt2


对于 Generator 命令,端点是

https://domain.com/artisan/api/{command}/{subcommand}/{name}?args=key1:value1,key2:value2&options=opt1:value1,opt2

请注意,有一个 name 变量。由于所有 Generator 命令都需要一个名为 name 的参数,因此需要指定您想要的内容。


命令示例

php artisan list

将转换为

https://domain.com/artisan/api/list


和这个

php artisan cache:forget myCachedKeyName

将转换为

https://domain.com/artisan/api/cache/forget?args=key:myCachedKeyName


另一个

php artisan optimize:clear -v

将转换为

https://domain.com/artisan/api/optimize/clear?options=v


一个 Generator 命令

php artisan make:model MyModel --controller -f

将转换为

https://domain.com/artisan/api/make/model/MyModel?options=controller,f

具有一个以上字符的选项将转换为 --option

响应

调用端点后,您将收到一个 `` 响应。

成功

当一切正常时: status : 200 OK

{
  "ok": true,
  "status": 200,
  "output": "Output of the command, given by Artisan"
}
未找到

当输入的命令未被应用程序找到时: status : 404 Not Found

{
  "ok": false,
  "status": 404,
  "output": "Command 'command:subcommand' is not defined."
}
无效的参数格式

当参数以无效格式给出时: status : 500 Server Error

{
  "ok": false,
  "status": 500,
  "output": "Argument(s) 'key:value' given by an invalid format."
}
无效的选项格式

当选项以无效格式给出时: status : 500 Server Error

{
  "ok": false,
  "status": 500,
  "output": "Options(s) 'key:value' given by an invalid format."
}

禁止路由

您可能希望限制对某些关键命令(如 db:seed)的访问。 Artisan-Api 已经想到了这一点,并使这些命令对客户端不可访问。要指定禁止的命令,您被鼓励在 config/artisan.php 文件中添加它们。

return [
    ...,

    'forbidden-routes' => [
        'clear-compiled',
        'tinker',
        'up',
        'down',
        'serve',
        'completion',
        '_complete',
        'db*', // all `db:seed` and `db:wipe` will be inaccessible
        '*publish' // like `vendor:publish`
    ]
];

当客户端想要通过端点访问这些命令时,它将收到一个 404 NOT_FOUND HTTP 响应。

身份验证

所有端点都将生成在Laravel的api中间件下,并受到内置的认证系统保护,主要使用Sanctum和API令牌。

配置

如前所述,存在一个配置文件config/artisan.php。您可以自由修改所需的值。

API 前缀和 HTTP 方法

在此,您可以更改默认的API前缀并按需自定义。此外,您可以使用您设置的任何HTTP方法访问端点。

return [
    ...
    'api' => [
        'prefix' => "/artisan/api",
        'method'    => 'POST', // or ['POST', 'PUT']
    ],
    ...
];

自动运行

由于某些原因,尤其是在生产模式下,您可能不希望允许通过HTTP请求执行命令。为了防止这种行为,将auto-run设置为false

return [
    ...
    'auto-run' => false,
    ...
];

这防止默认加载包的ArtisanApiServiceProvider服务提供者。

安全性

Artisan-Api已尽最大努力保护RCE漏洞和其他可能的逻辑错误。

Artisan-Api在内部使用Symfony/console,所有命令的执行都由它过滤和识别。没有直接调用shell_exec()exec()函数。

IP限制

您可以直接允许任意多的IP访问您的命令。 '*'表示所有IP都受信任。

中间件

Artisan-Api中有两个中间件。

CheckEnvMode中间件用于在生产环境中终止请求。

AbortForbiddenRoute中间件用于在访问受禁路由时抛出404 NOT_FOUND状态码。

有用提示

;)

待办事项

  1. 最好将查询字符串中的argsoptions转换为数组。
    • 例如:?arg[key1]=value1&arg[key2]=value2(这是处理查询字符串值的一种更标准的方式)
  2. 实现一种处理交互式命令(如tinker)的方式(可能可以通过套接字实现)
  3. 使响应对用户更易读,(移除"\n",...)