GNU/Linux >> Tutoriels Linux >  >> Linux

Authentification de Linux vers Windows SQL Server avec pyodbc

Vous devez obtenir un ticket Kerberos pour que cela fonctionne. Votre exemple ne précise pas si votre système Linux est configuré pour s'authentifier via Kerberos ou si vous avez déjà obtenu un ticket Kerberos avant que votre code n'atteigne votre chaîne de connexion.

Si votre système Linux est configuré pour s'authentifier via Kerberos, alors comme preuve de concept, vous pouvez obtenir un ticket Kerberos en utilisant kinit à partir de la ligne de commande. Voici ce qui fonctionne pour moi dans python3 exécuté dans Ubuntu sur Windows via le WSL. Le code 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')

Cela vous indique si vous n'avez pas de ticket. Puisqu'il utilise un ticket, vous n'avez pas besoin de spécifier un utilisateur ou un mot de passe dans le script. Il ignorera les deux.

Maintenant, nous l'exécutons :

[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]:~#

Vous pouvez également réussir à obtenir un ticket Kerberos à partir du code python qui s'exécute avant d'établir cette connexion, mais cela dépasse le cadre de cette réponse. Une recherche de modules python Kerberos pourrait vous orienter vers une solution.

Il apparaît également possible de paramétrer le système Linux de manière à ce que dès qu'un utilisateur se connecte, il obtienne automatiquement un ticket Kerberos pouvant être transmis à d'autres processus. Cela sort également du cadre de cette réponse, mais une recherche de ticket Kerberos automatique lors de la connexion Linux peut donner des indices.


J'ai fini par utiliser la bibliothèque pymssql qui est essentiellement pyodbc au-dessus du pilote FreeTDS. Cela a fonctionné dès la sortie de la boîte.

Bizarre comme j'ai eu tant de mal à découvrir cette bibliothèque..


Linux
  1. Lecture d'un fichier CSV avec des requêtes SQL à partir du shell Linux

  2. Utilisation de Samba pour partager un dossier d'un invité Linux avec un hôte Windows dans VirtualBox

  3. Comment utiliser rsync depuis un PC Windows vers un serveur Linux distant ?

  4. Puis-je me connecter à une machine Windows à partir du shell Linux ?

  5. Comment partager Internet avec Windows depuis ma machine Linux ?

Passer de Windows à Linux

Comment se connecter en SSH à votre serveur Linux à partir de Windows

Connectez-vous à un serveur Linux avec une clé privée SSH sur un client Windows

Comment se connecter à SQL Server à partir de Linux

Installer Windows 10 sur Linux avec VirtualBox

Dois-je choisir Linux Server ou Windows ?