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

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

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

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

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

有什么方法可以将 SSH key 存储在数据库中并动态设置它?

最佳答案

这是使用您提到的包同时使用模型作为“ key ”的 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!"',
]);

关于php - 如何在 Laravel 5.5 中动态设置 SSH key ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50464207/

10-12 00:07
查看更多