sshUserSetup.sh重复执行会直接覆盖authorized_keys导致公钥丢失,引发间歇性连接失败;必须备份、分用户执行、验证SUCCESS结果,并严格匹配小写hostname、启用PubkeyAuthentication、修复私钥权限。
sshUserSetup.sh 重复执行会覆盖已有的 authorized_keys
脚本默认不追加、而是直接覆盖目标节点的 ~/.ssh/authorized_keys,如果之前手动添加过其他公钥(比如运维用的跳板机密钥),或已有多个用户互信(如同时配了 grid 和 oracle),重复运行会导致部分公钥丢失,从而出现“能连 a 但连不通 b”的间歇性失败。
实操建议:
- 每次重跑前先备份:
cp ~/.ssh/authorized_keys ~/.ssh/authorized_keys.bak - 确认脚本参数含
-advanced:否则只做单向(本地→远程),不建立双向互信 - 若已混用多个用户(如 grid + oracle),必须分别执行两遍,且不能交叉混跑——先全量配完
-user grid,再全量配-user oracle - 检查脚本输出末尾是否出现
Verification result: SUCCESS,仅看到SSH setup complete不代表验证通过
Oracle 11g RAC 要求 hostname 必须小写且 /etc/hosts 严格匹配
11g 的 cluvfy 和 runInstaller 会按字面解析 hostname 命令输出,若系统里是 RAC1(大写),但 /etc/hosts 写的是 rac1,或者 IP 映射了多个别名(如同时有 rac1 和 rac1.local),就会在验证时随机挑一个去连,结果连到不存在的主机名上,报 Permission denied (publickey) 或直接超时。
实操建议:
- 统一执行:
hostname | tr '[:upper:]' '[:lower:]',然后把输出结果写进所有节点的/etc/hosts对应行 - 每台节点执行:
grep $(hostname) /etc/hosts,确保只有一行,且 IP 正确、无多余空格或制表符 - 禁用 DNS 解析干扰:在
/etc/nsswitch.conf中确认hosts: files dns顺序,且不要启用mdns4_minimal - 避免使用
localhost别名参与互信——11g 不认这个,必须用真实 hostname
sshd_config 关键参数被注释或设为 no
Oracle 11g RAC 安装过程中的 SSH 连接由 root 用户发起(即使你配的是 grid 用户),而很多系统默认关闭了 PermitRootLogin 或 PubkeyAuthentication。一旦这些被注释或设为 no,sshUserSetup.sh 就会在静默中失败,后续 cluvfy 报 [INS-06006] 却查不到具体原因。
实操建议:
- 检查目标节点的
/etc/ssh/sshd_config,确认以下三行未被注释且值为 yes:PubkeyAuthentication yes、PermitRootLogin yes(或without-password)、UsePAM no(PAM 可能干扰密钥认证) - 改完后必须重启服务:
service sshd restart(RHEL5/6)或systemctl restart sshd(RHEL7+) - 验证是否生效:
sshd -T | grep -E "(pubkey|permitroot|usepam)",注意大小写和拼写 - 特别注意:某些 Oracle Linux 镜像默认启用
SELinux,即使配置正确,也会拦截 root 的 pubkey 登录,临时验证可执行setenforce 0
私钥权限错误或 ~/.ssh 目录被脚本误删
sshUserSetup.sh 在生成密钥前会强制清空 ~/.ssh 并重建,如果该目录下有自定义配置(如 config、known_hosts),或旧私钥被误删,脚本会重新生成一套新密钥,但不会同步更新已分发到其他节点的 authorized_keys —— 导致“本机能连自己,但连不了别人”。
实操建议:
- 运行前先确认:
ls -ld ~/.ssh应为drwx------(700),ls -l ~/.ssh/id_rsa*中私钥必须是-rw-------(600) - 若发现权限异常,不要只改权限,先检查是否被脚本删过目录:
stat ~/.ssh看 ctime 是否接近脚本执行时间 - 重跑脚本后,立刻在每个节点执行:
ssh -o ConnectTimeout=5 -o BatchMode=yes $USER@$(hostname) date 2>/dev/null,确保本机 self-check 通过 - 若仍失败,跳过脚本,改用手动方式:
ssh-keygen -t rsa -b 2048 -f ~/.ssh/id_rsa -N "",再用ssh-copy-id逐节点推送
ssh -v 手动连一次失败节点,看日志停在哪一步——是解析失败?连接拒绝?还是密钥不匹配?定位到那行 debug 输出,基本就锁定了问题根因。











