2

简而言之,我想在没有管理员干预的情况下通过 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。

4

2 回答 2

2

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

alter user user_name identified by new_password;
于 2012-11-04T18:34:35.433 回答
0

在 C 语言中

根据OCI 文档,您可以通过 C APIOCIPasswordChange()调用:

OCIPasswordChange()调用使应用程序能够根据需要修改用户的数据库密码。如果调用OCISessionBegin()返回指示用户密码已过期的错误消息或警告,这将特别有用。

另请参阅函数的 API 文档OCIPasswordChange()

在 Python 中

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

于 2016-12-08T13:33:23.807 回答