2

要するに、管理者の介入なしに、シェルスクリプトを介してセルフサービスの期限切れパスワードの変更を自動化したいと考えています。

残念ながら、私のアプローチは失敗し、その理由がわかりません:

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 を受け入れないのはなぜだろうか。

何か案は?

注: 1 年前の質問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のドキュメントによると、次のOCIPasswordChange()呼び出しでC APIから実行できます。

このOCIPasswordChange()呼び出しにより、アプリケーションは必要に応じてユーザーのデータベース パスワードを変更できます。OCISessionBegin()これは、 の呼び出しが、ユーザーのパスワードの有効期限が切れていることを示すエラー メッセージまたは警告を返す場合に特に役立ちます。

関数の API ドキュメントOCIPasswordChange()も参照してください。

Python で

他の言語用の OCI ベースのライブラリも、この機能を公開している場合があります。たとえば、Python のcx_Oracle.connect()関数にはnewpassword引数があります。

于 2016-12-08T13:33:23.807 に答える