新闻中心 分类>>

Laravel怎么连接和操作多个远程服务器(SSH)

2025-11-23 00:00:00
浏览次数:
返回列表
使用phpseclib替代Laravel废弃的Remote组件,通过Composer安装后,在config/servers.php中配置多服务器信息,并创建SSH工具类实现远程操作。

Laravel 本身不直接提供 SSH 连接功能,但你可以借助 Laravel 的任务调度和 illuminate/remote 组件(已废弃)或更现代的方案如 phpseclib/phpseclib 来连接并操作多个远程服务器。下面介绍一种稳定、实用的方法。

使用 phpseclib 操作多个远程服务器

注意:Laravel 官方的 Remote 组件在 Laravel 5.8 后已被移除,推荐使用第三方安全且活跃维护的库——phpseclib/phpseclib

以下是具体实现步骤:

1. 安装 phpseclib

通过 Composer 安装:

composer require phpseclib/phpseclib

2. 配置多个服务器信息

可以在 config/servers.php 中定义你的远程服务器列表:

return [ 'production' => [ [ 'host' => '192.168.1.10', 'port' => 22, 'username' => 'root', 'password' => 'your_password', // 或使用私钥 'key' => '/path/to/private/key', // 可选 'agent' => true, // 使用 SSH agent ], [ 'host' => '192.168.1.11', 'port' => 22, 'username' => 'deploy', 'password' => null, 'key' => storage_path('app/deploy_key'), ] ], 'staging' => [ [ 'host' => 'staging.example.com', 'port' => 22, 'username' => 'user', 'password' => 'pass123' ] ] ];

3. 创建 SSH 工具类

新建一个服务类来管理 SSH 连接:

servers = config('servers.production'); // 可动态传入配置组 } public function runOnAll($commands) { $results = []; foreach ($this->servers as $server) { $ssh = new SSH2($server['host'], $server['port']); $login = false; if (isset($server['key'])) { $key = new RSA(); $privateKey = file_get_contents($server['key']); $key->loadKey($privateKey); $login = $ssh->login($server['username'], $key); } elseif ($server['password']) { $login = $ssh->login($server['username'], $server['password']); } if (!$login) { $results[] = [ 'host' => $server['host'], 'success' => false, 'output' => 'Login failed' ]; continue; } // 执行多条命令 $output = ''; foreach ((array)$commands as $cmd) { $output .= $ssh->exec($cmd . "\n"); } $ssh->disconnect(); $results[] = [ 'host' => $server['host'], 'success' => true, 'output' => trim($output) ]; } return $results; } }

4. 在控制器或命令中调用

例如在 Artisan 命令中批量执行更新操作:

runOnAll($commands); foreach ($results as $result) { if ($result['success']) { $this->info("✅ {$result['host']}: Success"); $this->line($result['output']); } else { $this->error("❌ {$result['host']}: " . $result['output']); } } } }

5. 可选:支持不同环境切换

可以扩展 ServerManager,接受参数选择不同配置组(如 staging、production),便于灵活调用。

6. 安全建议

  • 避免在代码中硬编码密码,使用密钥认证 + SSH Agent 更安全
  • 私钥文件权限设为 600,并放在 storage/ 等非公开目录
  • 考虑使用 Laravel 的加密机制保护敏感配置
  • 生产环境中禁用密码登录,仅允许密钥登录
基本上就这些。结合 Laravel 的调度系统(app/Console/Kernel.php),你还可以定时自动执行远程任务,比如每日备份、日志清理等。整个流程清晰、可控,适合中小型运维自动化需求。

搜索