GNU/Linux >> Tutoriales Linux >  >> Linux

Autenticar desde Linux a Windows SQL Server con pyodbc

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...


Linux
  1. Conéctese a Linux desde Windows usando PuTTY

  2. ¿Cómo usar rsync desde una PC con Windows a un servidor Linux remoto?

  3. Cómo SCP desde un servidor Linux a un cliente Windows

  4. ¿Puedo conectarme a una máquina con Windows desde el shell de Linux?

  5. ¿Cómo registro el servidor Linux con el servidor DNS de Windows?

Cambiar de Windows a Linux

Cómo SSH en su servidor Linux desde Windows

Inicie sesión en un servidor Linux con una clave privada SSH en un cliente de Windows

Cómo conectarse a SQL Server desde Linux

Instalar Windows 10 en Linux con VirtualBox

¿Debo elegir un servidor Linux o Windows?