代码之家  ›  专栏  ›  技术社区  ›  Adarsh Sojitra

如何在Laravel5.5中动态设置ssh密钥?

  •  3
  • Adarsh Sojitra  · 技术社区  · 6 年前

    我正在管理多个服务器的网络,并希望使用ssh密钥与服务器连接。我发现我们可以给Laravel的ssh密钥提供路径 远程.php 配置文件如下:

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

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

    我们可以用 config::set(); 在这种情况下也是如此,但是那样的话,我将不得不使用服务器标识将所有ssh密钥存储在特定的目录中。但是,我希望将ssh密钥保存在数据库中,因为它更稳定,备份更友好。

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

    有没有任何方法可以将ssh密钥存储在数据库中并动态地进行设置?

    1 回复  |  直到 6 年前
        1
  •  6
  •   Quezler    6 年前

    下面是一个将模型用作“密钥”时使用上述包的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!"',
    ]);