これを機能させるには、Kerberos チケットを取得する必要があります。あなたの例では、Linux システムが Kerberos を介して認証するように設定されているかどうか、またはコードが接続文字列に到達する前に Kerberos チケットを以前に取得したかどうかを指定していません。
Linux システムが Kerberos 経由で認証するように設定されている場合、概念実証として、コマンド ラインから kinit を使用して Kerberos チケットを取得できます。 WSLを介してWindows上のUbuntuで実行されているpython3で機能するのは次のとおりです。 Python コード:
#!/usr/bin/env python
# minimal example using Kerberos auth
import sys
import re
import pyodbc
driver='{ODBC Driver 17 for SQL Server}'
server = sys.argv[1]
database = sys.argv[2]
# trusted_connection uses kerberos ticket and ignores UID and PASSWORD in connection string
# https://docs.microsoft.com/en-us/sql/connect/odbc/linux-mac/using-integrated-authentication?view=sql-server-ver15
try:
cnxn = pyodbc.connect(driver=driver, server=server, database=database, trusted_connection='yes')
cursor = cnxn.cursor()
except pyodbc.Error as ex:
msg = ex.args[1]
if re.search('No Kerberos', msg):
print('You must login using kinit before using this script.')
exit(1)
else:
raise
# Sample select query
cursor.execute("SELECT @@version;")
row = cursor.fetchone()
while row:
print(row[0])
row = cursor.fetchone()
print('success')
これは、チケットを持っていない場合に表示されます。チケットを使用するため、スクリプトでユーザーまたはパスワードを指定する必要はありません。両方とも無視されます。
実行します:
[email protected]:~# kdestroy # make sure there are no active tickets
kdestroy: No credentials cache found while destroying cache
[email protected]:~# python pyodbc_sql_server_test.py tcp:dbserver.example.com mydatabase
You must login using kinit before using this script.
[email protected]:~# kinit
Password for [email protected]:
[email protected]:~# python pyodbc_sql_server_test.py tcp:dbserver.example.com mydatabase
Microsoft SQL Server 2016 (SP2-GDR) (KB4505220) - 13.0.5101.9 (X64)
Jun 15 2019 23:15:58
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows Server 2016 Datacenter 10.0 <X64> (Build 14393: )
success
[email protected]:~#
この接続を確立する前に実行される Python コードから Kerberos チケットを取得することに成功することもありますが、それはこの回答の範囲を超えています。 Python Kerberos モジュールを検索すると、解決策が見つかるかもしれません。
ユーザーがログインするとすぐに、他のプロセスに渡すことができる Kerberos チケットを自動的に取得するように Linux システムをセットアップすることも可能です。これもこの回答の範囲外ですが、Linux ログイン時に自動 Kerberos チケットを検索すると、いくつかの手がかりが得られる場合があります。
FreeTDSドライバーの上に基本的にpyodbcであるpymssqlライブラリを使用することになりました。すぐに使えました。
不思議なことに、このライブラリを見つけるのにこんなに苦労した..