在 Linux 环境下配置 Oracle 数据库时,创建 oracle 用户后准备设定密码,系统却直接报错:the password contains the user name in some form。简而言之,系统认为你输入的密码与用户名过于相似。这种情况在实际操作中颇为常见,那么如何绕过这道限制呢?下面将详细梳理解决思路与具体操作步骤。

一、确认是否为密码复杂度策略所致
先别急着强行修改,我们应当检查系统中是否存在密码复杂度相关的配置。首先,查看 /etc/login.defs 文件:
vi /etc/login.defs

检索后未发现禁止密码与用户名相似的规则。

接下来检查 PAM 模块配置,编辑 /etc/pam.d/system-auth:
vi /etc/pam.d/system-auth

逐一排查后,同样未发现与“密码包含用户名”直接相关的策略选项。

既然两处均未设限,说明问题可能出在默认校验逻辑上——某些 Linux 发行版在 passwd 命令内部会主动判断,不允许密码包含用户名的任意子串。遇到这种情况,最便捷的方案就是换一种命令来设置密码。
二、强制设定密码
经过搜索发现,可以利用 passwd --stdin 的组合命令直接绕过该检查。前提是必须切换到 root 用户,只有 root 才具备此操作权限。

方法一:一行命令完成
echo oracle123 | passwd --stdin oracle
这条命令的作用是通过 echo 将密码通过管道直接传递给 passwd --stdin,以明文形式指定密码。为 oracle 用户重置密码为 oracle123,执行后查看结果:

如果输出显示 all authentication tokens updated successfully,则表示密码已成功重置。

方法二:交互式管道输入
若你不想用 echo 明文暴露密码(虽然 root 环境下并无大碍),也可采用另一种写法:
passwd --stdin oracle
输入后按回车,系统会等待你手动输入新密码,直接键入 oracle123 再按回车即可。注意此处不会回显字符,需盲打输入。


再次看到 all authentication tokens updated successfully,即表明操作成功。

归根结底,这个报错并非代表密码绝对不能与用户名相近——只是默认的 passwd 命令会自作主张拦截一下。使用 --stdin 参数就能巧妙地从“检测盲区”绕过。今后再遇到类似问题,直接采用上述两种方法之一即可解决。
