Oracle RAC要求SSH互信必须使用RSA算法,因老版本Grid Infrastructure不支持ed25519;ssh-keygen默认生成ed25519会导致ssh-copy-id失败,故需显式指定-t rsa -b 2048并设空密码-N ""确保无交互,同时严格校验权限、hostname解析及sshd配置。
为什么 ssh-keygen 生成的密钥必须用 -t rsa -b 2048(不能默认或选 ed25519)
oracle rac 11g/12c/19c 官方文档明确要求节点间 ssh 互信使用 rsa 算法,部分老版本 grid infrastructure 甚至不识别 ed25519 密钥——连 ssh -o hostkeyalgorithms=+ssh-ed25519 都救不回来。
更实际的问题是:ssh-keygen 在较新 openssh 版本中默认生成 ed25519,直接运行不加参数会卡在后续 ssh-copy-id 或手动分发环节,报错 no mutual signature algorithm 或静默失败。
实操建议:
- 统一执行
ssh-keygen -t rsa -b 2048 -f ~/.ssh/id_rsa -N "",强制生成兼容性最强的 RSA 密钥 -
-N ""是关键:空密码才能实现真正无交互,否则ssh-copy-id会卡住 - 生成后立刻检查
ls -l ~/.ssh/id_rsa*,确认私钥权限是600,公钥是644;权限不对会导致 ssh 拒绝读取
如何让 ssh-copy-id 一次跑通所有 RAC 节点(含 localhost)
RAC 要求每个节点既能免密登录其他节点,也必须能免密登录自己(localhost 和本机 hostname 都要通),否则 cluvfy 校验直接失败。但 ssh-copy-id 默认不支持本地回环,且批量操作时容易漏掉某个别名。
实操建议:
- 先把所有目标节点(含本机)写进变量:
NODES="node1 node2 localhost $(hostname)" - 逐个执行:
for n in $NODES; do ssh-copy-id -i ~/.ssh/id_rsa.pub $n; done - 特别注意:
$(hostname)必须参与,因为 Oracle 内部脚本常按hostname解析,不是localhost或 IP - 如果某节点提示
Permission denied (publickey),先手工ssh $n date看是否已通;不通就检查目标节点/etc/hosts是否把本机 IP 映射到了正确 hostname
~/.ssh/config 里哪些配置会破坏 RAC 的 SSH 自动发现
RAC 的 addNode.sh 和 root.sh 会绕过用户级 ~/.ssh/config,但 cluvfy 和部分 DBUA 场景会读它。一旦里面写了 Host * 全局匹配、ProxyCommand 或自定义 IdentityFile,就可能让工具误用错误密钥或跳过认证流程,最终报 PRVF-7532 : Failed to connect to node。
实操建议:
- 临时清空或重命名
~/.ssh/config(比如改名成config.bak),RAC 配置完成后再恢复 - 绝对不要在
~/.ssh/config里写StrictHostKeyChecking no—— 这会让cluvfy认为 SSH 不安全而拒绝继续 - 如果必须保留 config(如开发环境共用),至少确保没有
Host *块,且对 RAC 节点显式指定IdentitiesOnly yes和IdentityFile ~/.ssh/id_rsa
验证阶段最容易被忽略的三个检查点
很多人跑完 ssh-copy-id 就以为完了,结果 cluvfy stage -pre crsinst 仍失败。根本原因不是 SSH 不通,而是 Oracle 对“通”的定义比你严格得多。
实操建议:
- 在每个节点上分别执行:
ssh node1 date; ssh node2 date; ssh $(hostname) date; ssh localhost date—— 四个命令都必须秒回,不能有任何交互、密码提示或超时 - 检查
sshd配置:目标节点的/etc/ssh/sshd_config必须有PubkeyAuthentication yes和AuthorizedKeysFile .ssh/authorized_keys(不能是.ssh/authorized_keys2) - 确认
~/.ssh/authorized_keys文件末尾没多出空行或乱码,Oracle 的 key 解析器对格式敏感,一行多余换行都可能导致Authentication refused: bad ownership or modes
真正麻烦的从来不是生成密钥,而是 hostname 解析链、sshd 权限控制、和 Oracle 自己那套“看似标准实则挑刺”的 SSH 行为校验逻辑。漏掉任意一环,都会卡在 PRVF-4657 或 CRS-2672 后面那个让人摸不着头脑的报错里。

















