Debe obtener un ticket de Kerberos para que esto funcione. Su ejemplo no especifica si su sistema Linux está configurado para autenticarse a través de Kerberos o si obtuvo previamente un vale de Kerberos antes de que su código llegue a su cadena de conexión.
Si su sistema Linux está configurado para autenticarse a través de Kerberos, entonces, como prueba de concepto, puede obtener un vale de Kerberos utilizando kinit desde la línea de comandos. Esto es lo que funciona para mí en python3 ejecutándose en Ubuntu en Windows a través de WSL. El código de 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')
Esto le dice si usted no tiene un billete. Dado que utiliza un ticket, no tiene que especificar un usuario o contraseña en el script. Ignorará ambos.
Ahora lo ejecutamos:
[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]:~#
También puede tener éxito al obtener un boleto Kerberos del código python que se ejecuta antes de realizar esta conexión, pero eso está más allá del alcance de esta respuesta. Una búsqueda de módulos Kerberos de python podría indicarle una solución.
También parece posible configurar el sistema Linux para que, tan pronto como un usuario inicie sesión, obtenga automáticamente un ticket de Kerberos que se puede pasar a otros procesos. Eso también está fuera del alcance de esta respuesta, pero una búsqueda de un ticket automático de Kerberos al iniciar sesión en Linux puede arrojar algunas pistas.
Terminé usando la biblioteca pymssql que básicamente es pyodbc encima del controlador FreeTDS. Funcionó fuera de la caja.
Es extraño cómo me costó tanto descubrir esta biblioteca...