我有一个 python 脚本,它基本上使用x_Oracle
oracle 客户端连接到我的数据库服务器,连接后我可以运行 SQL 查询。
现在,由于我的数据库凭据已过期,我被迫使用我不知道的 kerberos 身份验证。以前只需执行以下代码即可工作:
conn_str = u'username/[email protected] /cdn-cgi/l/email-protection:1521/dbx1.ct.com'
conn = cx_Oracle.connect(conn_str)
c = conn.cursor()
c.execute(
"select DISTINCT ITEM_ID, UOM, from SMCFS93 where item = '" + item + "'")
for row in c:
print(row)
但现在我需要使用 kinit 生成票证,并且我有一个C:\kerberos\krb5.conf
文件和一个C:\krb5cc_User
我在 SQL Developer 中给出了路径位置的文件,然后我可以连接到我的数据库服务器。
如果想使用 SQL 开发人员连接到数据库,该方法可以正常工作,但我无法了解如何在 Python 中实现此操作。
我尝试创建一个子进程来每次进入 kinit 并生成票证,并在 stackoverflow 上尝试了一些答案,但我无法连接到我的数据库。任何有关如何使用 kerberos 连接数据库服务器的建议都会有很大帮助。
使用以下命令从 Python 连接到 Oracle:
- Oracle Instant Client 的 OCI 版本
- 通过 Windows 密钥库的 Kerberos
- jaydebeapi 和 jpype Python 库
好处:
- 无需手动输入用户名/密码即可生成 Kerberos
票。
- 使用活动 Windows 会话的凭据进行身份验证
Windows 密钥库。
- 无需跟踪和保护 Kerberos 密钥文件
- 其他应用程序(SQL*Plus、SQL Developer 等)可以重复使用相同的内容
Kerberos 配置
- krbcontext Python 库完全是
不必要。因此,Windows 机器上不需要 Docker。
Steps:
- 从 IT 人员处获取适用于您的 Windows 域的 krb5.conf(或创建一个)
-
通过在 Instant Client 的 \network\admin 子目录中创建 sqlnet.ora 文本文件,将 Oracle Instant Client 配置为使用 Kerberos 身份验证。文件内容:
SQLNET.KERBEROS5_CONF={Path to your Krb5.conf file}
SQLNET.KERBEROS5_CONF_MIT=TRUE
SQLNET.AUTHENTICATION_SERVICES=(KERBEROS5PRE)
SQLNET.KERBEROS5_CC_NAME=OSMSFT:
-
验证 Instant Client 是否已正确配置 Kerberos。以下命令将连接服务器并进行身份验证,而不提示您输入用户名和密码。 (请勿将“/”替换为您的用户名和密码。)
sqlplus.exe /@server:port/SID
确保 Oracle Instant Client 根目录位于您的环境路径中。否则 jaydebeapi.connect 命令将抛出以下错误:java.lang.UnsatisfiedLinkError: no ocijdbc19 in java.library.path
-
使用 JDBC 在 Python 中连接
args = "-Djava.class.path=" + {jdbc_jar_file_path}
jpype.startJVM(args, convertStrings = False)
connection_string = 'jdbc:oracle:oci:/@server:port:sid'
jaydebeapi.connect(
{jdbc_java_class_name}
, connection_string
, jars = {jdbc_jar_file_path}
)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)