【问题标题】:How to dynamically set SSH key in Laravel 5.5?如何在 Laravel 5.5 中动态设置 SSH 密钥?
【发布时间】:2018-11-01 00:24:24
【问题描述】:

我正在管理一个由多台服务器组成的网络,并希望使用 SSH 密钥与服务器连接。我发现我们可以在 Laravel 的 remote.php 配置文件中提供 SSH 密钥的路径,如下所示:

.
.
'key' => '/path/to/ssh/key'
.
.

但由于我想连接许多服务器,我无法为所有服务器设置单个私钥,因为它不安全。所以,我唯一能想到的就是动态设置 SSH 密钥。到目前为止,我使用密码登录,我可以使用 Config::set(); 动态设置,但我不知道如何动态设置 SSH 密钥。

在这种情况下,我们也可以使用Config::set();,但是那样,我必须将所有 SSH 密钥存储在具有服务器身份的特定目录中。但是,我想将 SSH 密钥保存在数据库中,因为它更稳定且便于备份。

我还考虑在连接到服务器之前使用服务器的 SSH 密钥更新 SSH 密钥文件,但它会产生我不想要的开销,因为它会减慢连接速度,因为它会在每次与远程连接时写入 SSH 密钥文件通过 SSH 连接服务器。

有什么方法可以将 SSH 密钥存储在数据库中并进行动态设置?

【问题讨论】:

  • 1) laravel 默认没有config/remote.php 2) 你能否展示一些示例代码来说明如何确定要设置哪个 ssh 密钥? 3)您还可以将任何相关(包括尚未工作的)代码附加到帖子中吗?
  • 1.我知道 laravel 默认不提供config/remote.php。我正在使用 laravelcollective 的远程包来处理我的所有连接。我想像设置密码一样设置 SSH 密钥。我不想定义 SSH 密钥的路径,但我想将 SSH 密钥内容直接放入 remote.php 中的key 指令中。这样,我可以直接从数据库中动态设置 SSH 密钥。
  • 我没有代码,因为这里缺少逻辑,没有逻辑,我们显然无法编写代码。但是,我可以通过在配置中定义 SSH 密钥文件来连接,但我不想每次尝试与服务器连接时都使用新密钥更新 SSH 密钥文件。
  • 好的,现在输入一个大答案,等一下:)
  • @p01ymath 老实说,从来没有在我的项目中使用这个包,但是在阅读了一些代码之后,我认为你的场景是可能的。 keytext config 是您所缺少的。值得一读的源代码github.com/LaravelCollective/remote/blob/5.5/config/…github.com/LaravelCollective/remote/blob/5.5/src/…

标签: php laravel ssh laravel-5.5


【解决方案1】:

这是一个使用您提到的包同时使用模型作为“密钥”的 ssh 示例:

忽略包添加的服务提供者:

"extra": {
    "laravel": {
        "dont-discover": [
            "Collective\\Remote\\RemoteServiceProvider"
        ]
    }
},

getConfig() 方法添加到包含 ssh 详细信息的模型中:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Connection extends Model
{
    public function getConfig(): array {
        return [
            'host'      => '',
            'username'  => '',
            'password'  => '',
            'key'       => '',
            'keytext'   => $this->key,
            'keyphrase' => '',
            'agent'     => '',
            'timeout'   => 10,
        ];
    }
}

创建一个名为App\Overrides\RemoteManager的文件:

<?php

namespace App\Overrides;

class RemoteManager extends \Collective\Remote\RemoteManager
{
    protected function getConfig($model)
    {
        return $model->getConfig();
    }
}

创建一个新的服务提供者:

<?php

namespace App\Providers;

use App\Overrides\RemoteManager;

class RemoteServiceProvider extends \Collective\Remote\RemoteServiceProvider
{
    public function register()
    {
        $this->app->singleton('remote', function ($app) {
            return new RemoteManager($app);
        });
    }
}

在“包服务提供者”下将\App\Providers\RemoteServiceProvider::class,添加到config/app.php

这将如何工作的示例代码:

$connection = \App\Models\Connection::find(1);
SSH::into($connection)->run([
    'echo "Hello world!"',
]);

【讨论】:

  • 我想这就是我想要的。谢谢!
猜你喜欢
  • 2020-07-14
  • 2014-09-06
  • 2018-07-01
  • 2020-03-01
  • 1970-01-01
  • 2016-01-28
  • 2019-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多