首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Anaconda3 3的python找不到kerberos凭据缓存。

Anaconda3 3的python找不到kerberos凭据缓存。
EN

Stack Overflow用户
提问于 2018-06-11 21:38:20
回答 1查看 2.1K关注 0票数 3

使用Anaconda版本的Python 3创建到MSSQL服务器的ODBC连接时,我遇到了一个错误:

pyodbc.Error:(“HY000”,“用于SQL ServerSSPI提供程序的HY000ODBC驱动程序17 :没有Kerberos凭据可用”(默认缓存: KEYRING:persistent:1918003883) (851968) (SQLDriverConnect))

服务器已经通过SSSD加入了Windows域和Kerberos领域。我可以将SSH放入服务器,并使用kinit检索TGT。我甚至可以看到使用klist的凭证缓存。但是python进程似乎既找不到Kerberos TGT,也找不到Kerberos凭据缓存。

设置:

python

代码语言:javascript
复制
$ /mnt/ds/anaconda3/bin/python --version
Python 3.6.5 :: Anaconda, Inc.

test.py

代码语言:javascript
复制
from pyodbc import connect
connection = connect('DSN=MyDSN')

/etc/odbc.ini

代码语言:javascript
复制
[MyDSN]
#Driver=ODBC Driver 13 for SQL Server
Driver=ODBC Driver 17 for SQL Server
Description=MyMSSQL ODBC Driver
Trace=No
Server=MyMSSQL
Trusted_Connection=Yes

/etc/odbcinst.ini

代码语言:javascript
复制
[ODBC Driver 17 for SQL Server]
Description=Microsoft ODBC Driver 17 for SQL Server
Driver=/opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.1.so.0.1
UsageCount=1

红帽企业Linux

代码语言:javascript
复制
$ cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.5 (Maipo)
$ uname -r
3.10.0-862.2.3.el7.x86_64

msodbcsql17

代码语言:javascript
复制
$ sudo yum info msodbcsql17
Loaded plugins: amazon-id, rhui-lb, search-disabled-repos
Installed Packages
Name        : msodbcsql17
Arch        : x86_64
Version     : 17.1.0.1
Release     : 1
Size        : 17 M
Repo        : installed
From repo   : packages-microsoft-com-prod
Summary     : ODBC Driver for Microsoft(R) SQL Server(R)
License     : https://aka.ms/odbc170eula
Description : This package provides an ODBC driver that can connect to Microsoft(R) SQL Server(R).

unixODBC

代码语言:javascript
复制
$ sudo yum info unixODBC
Loaded plugins: amazon-id, rhui-lb, search-disabled-repos
Installed Packages
Name        : unixODBC
Arch        : x86_64
Version     : 2.3.1
Release     : 11.el7
Size        : 1.2 M
Repo        : installed
From repo   : rhui-REGION-rhel-server-releases
Summary     : A complete ODBC driver manager for Linux
URL         : http://www.unixODBC.org/
License     : GPLv2+ and LGPLv2+
Description : Install unixODBC if you want to access databases through ODBC.
            : You will also need the mysql-connector-odbc package if you want to access
            : a MySQL database, and/or the postgresql-odbc package for PostgreSQL.
$ /mnt/ds/anaconda3/bin/conda list unixodbc
# packages in environment at /mnt/ds/anaconda3:
#
# Name                    Version                   Build  Channel
unixodbc                  2.3.6                h1bed415_0

皮氏

代码语言:javascript
复制
$ /mnt/ds/anaconda3/bin/conda list pyodbc
# packages in environment at /mnt/ds/anaconda3:
#
# Name                    Version                   Build  Channel
pyodbc                    4.0.23           py36hf484d3e_0

这里有一些我尝试过的东西:

  • 使用Python-2.7.15,由Anaconda2打包。起作用了!
  • 使用isql。我负责isql MyDSN和那个连接。
  • 有两个unixODBC库(一个通过yum安装;另一个通过conda安装)。默认情况下,它将使用conda,但我强迫它使用带有LD_PRELOAD的系统unixODBC包。同样的错误。
  • 我尝试将数据库驱动程序降级为msodbcsql-13.1.9.2-1,然后降级到msodbcsql-13.0.1.0-1。同样的错误。
  • 我尝试将PyODBC替换为TurbODBC,这是另一个PyODBC库。同样的错误。
  • 我用python-3.5在conda中创建了一个单独的环境。这起作用了!还是不知道为什么。
  • 我编写了一个与unixODBC接口的简单C程序。该程序能够通过Kerberos连接到MSSQL服务器。
  • 我通过python2运行python3阳性测试用例和python3阴性测试用例来检查系统调用。我想这可能会透露些什么。似乎他们都开始在文件系统上寻找client.keytab文件。然后,在积极的测试用例中,它将返回到搜索内核的密钥环,在那里它将成功地找到凭证缓存并继续执行。但是,在负测试用例中,它只是重新尝试查找client.keytab,而从不尝试搜索密钥环。
  • 我启用了unixODBC跟踪选项,一个带有Python3测试用例,另一个使用Python2测试用例。不幸的是,这些痕迹(如下所示)并没有向我透露任何东西。

py3-unixodbc.trace

代码语言:javascript
复制
[ODBC][8741][1527046794.480751][__handles.c][460]
                Exit:[SQL_SUCCESS]
                        Environment = 0x55eea73ed130
[ODBC][8741][1527046794.480806][SQLSetEnvAttr.c][189]
                Entry:
                        Environment = 0x55eea73ed130
                        Attribute = SQL_ATTR_ODBC_VERSION
                        Value = 0x3
                        StrLen = 4
[ODBC][8741][1527046794.480824][SQLSetEnvAttr.c][363]
                Exit:[SQL_SUCCESS]
[ODBC][8741][1527046794.480843][SQLAllocHandle.c][375]
                Entry:
                        Handle Type = 2
                        Input Handle = 0x55eea73ed130
[ODBC][8741][1527046794.480861][SQLAllocHandle.c][493]
                Exit:[SQL_SUCCESS]
                        Output Handle = 0x55eea7400500
[ODBC][8741][1527046794.481176][SQLDriverConnectW.c][290]
                Entry:
                        Connection = 0x55eea7400500
                        Window Hdl = (nil)
                        Str In = [DSN=MyDSN][length = 15]
                        Str Out = (nil)
                        Str Out Max = 0
                        Str Out Ptr = (nil)
                        Completion = 0
                UNICODE Using encoding ASCII 'ISO8859-1' and UNICODE 'UCS-2LE'

[ODBC][8741][1527046794.575566][__handles.c][460]
                Exit:[SQL_SUCCESS]
                        Environment = 0x55eea746e360
[ODBC][8741][1527046794.575614][SQLGetEnvAttr.c][157]
                Entry:
                        Environment = 0x55eea746e360
                        Attribute = 65002
                        Value = 0x7ffd399177f0
                        Buffer Len = 128
                        StrLen = 0x7ffd3991778c
[ODBC][8741][1527046794.575632][SQLGetEnvAttr.c][264]
                Exit:[SQL_SUCCESS]
[ODBC][8741][1527046794.575651][SQLFreeHandle.c][219]
                Entry:
                        Handle Type = 1
                        Input Handle = 0x55eea746e360

py2-unixodbc.trace

代码语言:javascript
复制
[ODBC][8746][1527046842.073439][__handles.c][460]
                Exit:[SQL_SUCCESS]
                        Environment = 0x185e2e0
[ODBC][8746][1527046842.073530][SQLSetEnvAttr.c][189]
                Entry:
                        Environment = 0x185e2e0
                        Attribute = SQL_ATTR_ODBC_VERSION
                        Value = 0x3
                        StrLen = 4
[ODBC][8746][1527046842.073552][SQLSetEnvAttr.c][363]
                Exit:[SQL_SUCCESS]
[ODBC][8746][1527046842.073572][SQLAllocHandle.c][375]
                Entry:
                        Handle Type = 2
                        Input Handle = 0x185e2e0
[ODBC][8746][1527046842.073590][SQLAllocHandle.c][493]
                Exit:[SQL_SUCCESS]
                        Output Handle = 0x1857d40
[ODBC][8746][1527046842.073613][SQLDriverConnectW.c][290]
                Entry:
                        Connection = 0x1857d40
                        Window Hdl = (nil)
                        Str In = [DSN=MyDSN][length = 15]
                        Str Out = (nil)
                        Str Out Max = 0
                        Str Out Ptr = (nil)
                        Completion = 0
                UNICODE Using encoding ASCII 'ISO8859-1' and UNICODE 'UCS-2LE'

[ODBC][8746][1527046842.208760][__handles.c][460]
                Exit:[SQL_SUCCESS]
                        Environment = 0x1967210
[ODBC][8746][1527046842.208830][SQLGetEnvAttr.c][157]
                Entry:
                        Environment = 0x1967210
                        Attribute = 65002
                        Value = 0x7ffe1153fcf0
                        Buffer Len = 128
                        StrLen = 0x7ffe1153fc8c
[ODBC][8746][1527046842.208849][SQLGetEnvAttr.c][264]
                Exit:[SQL_SUCCESS]
[ODBC][8746][1527046842.208869][SQLFreeHandle.c][219]
                Entry:
                        Handle Type = 1
                        Input Handle = 0x1967210

只需说一句,我的智慧就到了尽头。任何想法都将不胜感激!

EN

回答 1

Stack Overflow用户

发布于 2019-01-21 10:21:47

迟回复,但我希望有人会发现它有用。

对我来说,krb5包也解决了这个问题,它与系统范围的kerberos安装共存:将它从环境中删除解决了问题(我试图使它工作,但没有成功)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50806400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档