在甲骨文云创建实例时,通过控制台的高级选项填入 cloud-init 用户数据脚本,是自动配置 SSH 密钥最稳妥的方式,适用于新购实例或需要批量标准化密钥的场景。
先说结论:云初始化脚本仅在实例首次启动时执行,适合在新建实例阶段写入公钥,已有实例请勿依赖此方法修改密钥。
- 适合:新购实例、批量创建、需要统一密钥管理的场景
- 先准备:本地生成 SSH 密钥对,准备好公钥内容
- 验收:实例启动后能否免密登录,检查云初始化日志
命令速用版
#cloud-config
ssh_authorized_keys:
- ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ... your_public_key_here
将上述内容保存为文本,在创建实例的“高级选项”中粘贴到“云初始化”框内,确保格式为 YAML。
为什么会这样
甲骨文云实例底层依赖 cloud-init 工具进行初始化配置。当你创建实例时,控制台会将你填入的“用户数据”传递给实例内部的 cloud-init 服务。该服务在系统首次启动阶段读取数据,并根据指令修改系统配置,包括写入 SSH 公钥到默认用户的 authorized_keys 文件中。这是一种标准的云主机引导机制,但它的触发条件严格限定在首次启动周期内。
分步处理
1. 生成密钥对:在本地终端运行 ssh-keygen -t rsa -b 4096,按提示生成密钥,默认路径通常在 ~/.ssh/id_rsa.pub。
2. 获取公钥内容:使用 cat ~/.ssh/id_rsa.pub 查看公钥,复制完整内容,确保开头是 ssh-rsa 或 ssh-ed25519。
3. 编写云初始化脚本:按照“命令速用版”中的 YAML 格式,将公钥填入 ssh_authorized_keys 列表下,注意缩进必须严格对齐。
4. 创建实例时填入:在甲骨文云控制台创建实例页面,展开“高级选项”,找到“云初始化”输入框,粘贴脚本内容。
5. 启动实例:完成创建并启动实例,等待状态变为“运行中”。
怎么验证是否生效
1. 尝试 SSH 登录:使用本地私钥 ssh -i ~/.ssh/id_rsa opc@实例公网 IP,若能直接登录且无需密码,说明密钥已写入。
2. 检查日志:登录实例后,查看 /var/log/cloud-init-output.log 文件,搜索 authorized_keys 相关字样,确认无报错信息。
3. 验证文件权限:执行 ls -l ~/.ssh/authorized_keys,确认文件归属为当前用户,权限应为 600 或 644。
常见坑
1. 仅限首次启动:云初始化脚本通常只在实例第一次启动时运行。如果实例已经创建完成,再修改控制台里的用户数据不会自动生效,除非你手动触发 cloud-init 或重新初始化实例。
2. 格式错误导致失效:YAML 格式对缩进非常敏感,公钥前必须有两个空格缩进,且公钥内容不能换行,否则会导致解析失败,密钥无法写入。
3. 默认用户差异:甲骨文云不同镜像的默认用户不同,Ubuntu 通常是 ubuntu,Oracle Linux 通常是 opc。脚本会将密钥写入当前默认用户目录,请确认你登录时使用的用户名匹配。
4. 覆盖风险:如果同时在控制台上传了 SSH 密钥又写了云初始化脚本,两者通常会合并,但为了避免冲突,建议只选用一种方式管理密钥。