You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel调用DigitalOcean API获取新创建Droplet登录凭证方法咨询

解决DigitalOcean Droplet登录凭证获取问题

嘿,作为刚接触DigitalOcean API的新手,你遇到的这个问题其实挺常见的——毕竟DO默认不会把Droplet的root密码通过API返回(出于安全考虑),只会发到你的注册邮箱里。咱们来一步步解决这个需求:

为什么$droplet->user_data()没用?

先澄清一下:user_data是你创建Droplet时传入的初始化脚本,它的作用是在Droplet启动时自动执行一些配置操作,比如安装软件、设置环境变量等。调用$droplet->user_data()只会返回你当初传入的脚本内容,根本不是用来获取登录凭证的,所以它自然帮不了你拿到密码~

两种可行的解决方案

方案1:用SSH密钥认证(强烈推荐,更安全)

这是DO官方推荐的登录方式,完全不需要密码,而且能避免邮箱收不到密码的尴尬:

  1. 先在你的DigitalOcean账户里添加SSH公钥(或者通过API创建密钥),拿到密钥的ID或指纹。
  2. 创建Droplet时,把SSH密钥的ID传给API,DO会自动把公钥写入Droplet的root/.ssh/authorized_keys文件里。
  3. 之后你就可以用本地的SSH私钥直接登录Droplet执行命令了。

给你修改后的代码示例(假设用的是laravel-digitalocean SDK):

public function store(Request $request, $id) {
    // 替换成你自己的SSH密钥ID
    $sshKeyId = 123456;

    // 创建Droplet时指定SSH密钥
    $droplet = DigitalOcean::droplets()->create([
        'name' => 'custom-droplet-' . uniqid(),
        'region' => 'nyc3',
        'size' => 's-1vcpu-1gb',
        'image' => 'ubuntu-20-04-x64',
        'ssh_keys' => [$sshKeyId], // 关键:加入SSH密钥
        // 其他必填参数...
    ]);

    // 用SSH私钥连接并执行命令(这里用phpseclib库,需要先安装:composer require phpseclib/phpseclib)
    $ssh = new \phpseclib3\Net\SSH2($droplet->ip_address);
    // 加载本地私钥文件
    $privateKey = new \phpseclib3\Crypt\RSA(file_get_contents(storage_path('ssh/id_rsa')));
    if ($ssh->login('root', $privateKey)) {
        $output = $ssh->exec('apt update && apt install -y nginx');
        // 处理命令输出...
    }
}

方案2:通过User Data自定义密码(适合必须用密码的场景)

如果你确实需要用密码登录,可以在创建Droplet时通过user_data脚本设置自定义密码,同时开启SSH密码登录:

  1. 生成一个安全的随机密码(别用硬编码的弱密码!)。
  2. 写一个bash脚本,用chpasswd设置root密码,修改SSH配置开启密码登录,最后重启SSH服务。
  3. 创建Droplet时把这个脚本作为user_data传入。

代码示例:

public function store(Request $request, $id) {
    // 生成随机安全密码(16位随机字符串)
    $securePassword = bin2hex(random_bytes(16));

    // 编写User Data脚本
    $userData = <<<EOF
#!/bin/bash
# 设置root密码
echo "root:$securePassword" | chpasswd
# 开启SSH密码登录
sed -i 's/PasswordAuthentication no/PasswordAuthentication yes/' /etc/ssh/sshd_config
# 重启SSH服务使配置生效
systemctl restart sshd
EOF;

    // 创建Droplet时传入User Data
    $droplet = DigitalOcean::droplets()->create([
        'name' => 'custom-droplet-' . uniqid(),
        'region' => 'nyc3',
        'size' => 's-1vcpu-1gb',
        'image' => 'ubuntu-20-04-x64',
        'user_data' => $userData, // 有些SDK需要base64编码,比如直接调用API的话,但laravel-digitalocean会自动处理
        // 其他必填参数...
    ]);

    // 现在你可以用$securePassword登录Droplet了
    // 记得把密码加密存储到数据库或安全的地方,不要明文保存!
}

小提醒

  • 不管用哪种方式,创建Droplet后都要等1-2分钟让初始化完成,再尝试连接,否则可能会出现连接超时或权限问题。
  • SSH密钥方式的安全性远高于密码,能避免暴力破解等风险,优先选这个方案!

内容的提问来源于stack exchange,提问作者user5838715

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:19:32