自动过期的密码更改

时间:2012-11-02 21:28:07

标签: oracle oracle10g passwords oracle11g stdin

简而言之,我希望通过shell脚本自动执行自助过期的密码更改,而无需管理员干预。

不幸的是,我的方法失败了,我不确定原因:

sqlplus -S /nolog << !
connect $userid/$password
xyzzy1                                            # my original uses $newpass
xyzzy1                                            # but results are the same
select distinct version from product_component_version;
exit;
!

产生

ERROR: ORA-28001: the password has expired        # connection succeeded
Changing password for USER
New password:                                     # carriage return succeeded?
Retype new password:                              # carriage return succeeded?
ERROR: ORA-00988: missing or invalid password(s)  # variables/STDIN may be NULL?
Password unchanged
SP2-0042: unknown command "xyzzy1" - rest of line ignored.
SP2-0042: unknown command "xyzzy1" - rest of line ignored.
SP2-0640: Not connected

似乎忽略了对新密码请求的传递响应,但同时它没有挂起。

手动连接并以交互方式提供相同的响应 工作。我想知道为什么密码更改过程不接受STDIN。

有什么想法吗?

注意:在撰写本文时提供了一年之久的问题Programmatically Change Expired Oracle DB Password?,虽然它完全取决于我的内容,但它对我不起作用。我不确定这方面的礼节,所以请提前道歉(重新)张贴。

我的环境是Solaris和Oracle 10g / 11g。

2 个答案:

答案 0 :(得分:2)

我建议以特权用户身份连接到数据库并执行:

alter user user_name identified by new_password;

答案 1 :(得分:0)

用C语言

根据OCI documentation,您可以通过OCIPasswordChange()调用从C API执行此操作:

  

OCIPasswordChange()调用使应用程序可以根据需要修改用户的数据库密码。如果对OCISessionBegin()的调用返回错误消息或警告表明用户的密码已过期,则此功能特别有用。

另见API documentation for the OCIPasswordChange() function

在Python中

其他语言的基于OCI的库也可能会公开此功能。例如Python's cx_Oracle.connect() function有一个newpassword参数。