GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Authentifizieren Sie sich mit pyodbc von Linux zu Windows SQL Server

Sie müssen ein Kerberos-Ticket anfordern, damit dies funktioniert. Ihr Beispiel gibt nicht an, ob Ihr Linux-System für die Authentifizierung über Kerberos eingerichtet ist oder ob Sie zuvor ein Kerberos-Ticket erhalten haben, bevor Ihr Code auf Ihre Verbindungszeichenfolge trifft.

Wenn Ihr Linux-System für die Authentifizierung über Kerberos eingerichtet ist, können Sie als Machbarkeitsnachweis ein Kerberos-Ticket mit kinit von der Befehlszeile abrufen. Folgendes funktioniert für mich in Python3, das in Ubuntu unter Windows über die WSL ausgeführt wird. Der Python-Code:

#!/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')

Dies sagt Ihnen, wenn Sie kein Ticket haben. Da es ein Ticket verwendet, müssen Sie im Skript weder einen Benutzer noch ein Passwort angeben. Es wird beides ignorieren.

Jetzt führen wir es aus:

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

Möglicherweise haben Sie auch Erfolg beim Abrufen eines Kerberos-Tickets aus Python-Code, der ausgeführt wird, bevor Sie diese Verbindung herstellen, aber das würde den Rahmen dieser Antwort sprengen. Eine Suche nach Python-Kerberos-Modulen könnte Sie auf eine Lösung hinweisen.

Denkbar erscheint auch, das Linux-System so einzurichten, dass es, sobald sich ein Benutzer anmeldet, automatisch ein Kerberos-Ticket erhält, das an andere Prozesse weitergegeben werden kann. Das liegt auch außerhalb des Rahmens dieser Antwort, aber eine Suche nach dem automatischen Kerberos-Ticket bei der Linux-Anmeldung kann einige Hinweise liefern.


Am Ende habe ich die pymssql-Bibliothek verwendet, die im Grunde genommen pyodbc auf dem FreeTDS-Treiber ist. Es funktionierte sofort.

Seltsam, wie schwer es mir fiel, diese Bibliothek zu entdecken..


Linux
  1. Ssh – Zugriff auf den Linux-Server von einem Windows-Computer im grafischen Modus über Ssh?

  2. Senden Sie E-Mails von der Befehlszeile mit einem externen SMTP-Server unter Linux

  3. Wie verbinde ich mich mit SQuirreL SQL von einer nicht in der Domäne registrierten Linux-Box mit SQL Server?

  4. Lesen einer CSV-Datei mit SQL-Abfragen aus der Linux-Shell

  5. Datei von Linux auf Windows Share mit C# (.NET Core) kopieren

Umstieg von Windows auf Linux

Wie Sie von Windows aus SSH in Ihren Linux-Server einbinden

Melden Sie sich mit einem privaten SSH-Schlüssel auf einem Windows-Client bei einem Linux-Server an

So stellen Sie von Linux aus eine Verbindung zu SQL Server her

Installieren Sie Windows 10 unter Linux mit VirtualBox

Soll ich Linux Server oder Windows wählen?