GNU/Linux >> Linux Esercitazione >  >> Linux

Autenticazione da Linux a Windows SQL Server con pyodbc

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


Linux
  1. come connettersi a SQL Server con SQuirreL SQL da Linux box non registrato nel dominio?

  2. Come utilizzare rsync dal PC Windows al server Linux remoto?

  3. Come eseguire SCP dal server Linux al client Windows

  4. Come posso condividere Internet con Windows dalla mia macchina Linux?

  5. Come registro il server Linux con il server DNS di Windows

Passaggio da Windows a Linux

Come SSH nel tuo server Linux da Windows

Accedi a un server Linux con una chiave privata SSH su un client Windows

Come connettersi a SQL Server da Linux

Installa Windows 10 su Linux con VirtualBox

Dovrei scegliere Linux Server o Windows?