Sie müssen ein Kerberos-Ticket anfordern, damit dies funktioniert. Ihr Beispiel gibt nicht an, ob Ihr Linux-System für die Authentifizierung über Kerberos eingerichtet ist oder ob Sie zuvor ein Kerberos-Ticket erhalten haben, bevor Ihr Code auf Ihre Verbindungszeichenfolge trifft.
Wenn Ihr Linux-System für die Authentifizierung über Kerberos eingerichtet ist, können Sie als Machbarkeitsnachweis ein Kerberos-Ticket mit kinit von der Befehlszeile abrufen. Folgendes funktioniert für mich in Python3, das in Ubuntu unter Windows über die WSL ausgeführt wird. Der Python-Code:
#!/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')
Dies sagt Ihnen, wenn Sie kein Ticket haben. Da es ein Ticket verwendet, müssen Sie im Skript weder einen Benutzer noch ein Passwort angeben. Es wird beides ignorieren.
Jetzt führen wir es aus:
[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]:~#
Möglicherweise haben Sie auch Erfolg beim Abrufen eines Kerberos-Tickets aus Python-Code, der ausgeführt wird, bevor Sie diese Verbindung herstellen, aber das würde den Rahmen dieser Antwort sprengen. Eine Suche nach Python-Kerberos-Modulen könnte Sie auf eine Lösung hinweisen.
Denkbar erscheint auch, das Linux-System so einzurichten, dass es, sobald sich ein Benutzer anmeldet, automatisch ein Kerberos-Ticket erhält, das an andere Prozesse weitergegeben werden kann. Das liegt auch außerhalb des Rahmens dieser Antwort, aber eine Suche nach dem automatischen Kerberos-Ticket bei der Linux-Anmeldung kann einige Hinweise liefern.
Am Ende habe ich die pymssql-Bibliothek verwendet, die im Grunde genommen pyodbc auf dem FreeTDS-Treiber ist. Es funktionierte sofort.
Seltsam, wie schwer es mir fiel, diese Bibliothek zu entdecken..