简而言之,我希望通过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。
答案 0 :(得分:2)
我建议以特权用户身份连接到数据库并执行:
alter user user_name identified by new_password;
答案 1 :(得分:0)
根据OCI documentation,您可以通过OCIPasswordChange()
调用从C API执行此操作:
OCIPasswordChange()
调用使应用程序可以根据需要修改用户的数据库密码。如果对OCISessionBegin()
的调用返回错误消息或警告表明用户的密码已过期,则此功能特别有用。
另见API documentation for the OCIPasswordChange()
function。
其他语言的基于OCI的库也可能会公开此功能。例如Python's cx_Oracle.connect()
function有一个newpassword
参数。