È necessario ottenere un ticket Kerberos affinché funzioni. Il tuo esempio non specifica se il tuo sistema Linux è configurato per l'autenticazione tramite Kerberos o se hai già ottenuto un ticket Kerberos prima che il tuo codice arrivi alla stringa di connessione.
Se il tuo sistema Linux è configurato per l'autenticazione tramite Kerberos, come prova del concetto puoi ottenere un ticket Kerberos utilizzando kinit dalla riga di comando. Ecco cosa funziona per me in python3 in esecuzione in Ubuntu su Windows tramite WSL. Il codice 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')
Questo ti dice se non hai un biglietto. Poiché utilizza un ticket, non è necessario specificare un utente o una password nello script. Ignorerà entrambi.
Ora lo eseguiamo:
[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]:~#
Potresti anche riuscire a ottenere un ticket Kerberos dal codice Python che viene eseguito prima di effettuare questa connessione, ma che va oltre lo scopo di questa risposta. Una ricerca di moduli Python Kerberos potrebbe indirizzarti verso una soluzione.
Sembra anche possibile configurare il sistema Linux in modo che non appena un utente accede, ottenga automaticamente un ticket Kerberos che può essere passato ad altri processi. Anche questo è al di fuori dello scopo di questa risposta, ma una ricerca di ticket Kerberos automatico all'accesso a Linux potrebbe fornire alcuni indizi.
Ho finito per usare la libreria pymssql che fondamentalmente è pyodbc sopra il driver FreeTDS. Ha funzionato immediatamente.
Strano come sia stato così difficile scoprire questa libreria...