GNU/Linux >> Znalost Linux >  >> Linux

Ověření z Linuxu na Windows SQL Server pomocí pyodbc

Aby to fungovalo, musíte získat lístek Kerberos. Váš příklad nespecifikuje, zda je váš systém Linux nastaven na ověřování prostřednictvím protokolu Kerberos nebo zda jste dříve získali lístek Kerberos předtím, než váš kód narazí na váš připojovací řetězec.

Pokud je váš systém Linux nastaven na autentizaci přes Kerberos, pak jako důkaz konceptu můžete získat lístek Kerberos pomocí kinit z příkazového řádku. Zde je to, co pro mě funguje v python3 běžícím v Ubuntu na Windows přes WSL. Kód pythonu:

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

To vám řekne, jestli nemáte lístek. Protože používá lístek, nemusíte ve skriptu zadávat uživatele ani heslo. Bude ignorovat obojí.

Nyní to spustíme:

[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ůže se vám také podařit získat lístek Kerberos z kódu pythonu, který běží před vytvořením tohoto připojení, ale to je nad rámec této odpovědi. Hledání modulů python Kerberos vás může nasměrovat k řešení.

Zdá se také možné nastavit systém Linux tak, aby jakmile se do něj uživatel přihlásí, automaticky získal lístek Kerberos, který lze předat dalším procesům. To je také mimo rozsah této odpovědi, ale hledání automatického lístku Kerberos při přihlášení k Linuxu může přinést určitá vodítka.


Nakonec jsem použil knihovnu pymssql, která je v podstatě pyodbc nad ovladačem FreeTDS. Fungovalo to hned po vybalení.

Zvláštní, jak jsem měl tak těžké objevit tuto knihovnu..


Linux
  1. Odesílejte poštu z příkazového řádku s externím serverem smtp v systému Linux

  2. Připojte se k Linuxu z Windows pomocí PuTTY

  3. jak se připojit k serveru SQL pomocí SQuirreL SQL z krabice Linux bez registrace domény?

  1. Zkopírujte soubor z linuxu do sdílení systému Windows pomocí C# (jádro .NET)

  2. Použití Samby ke sdílení složky od hosta Linuxu s hostitelem Windows ve VirtualBoxu

  3. Mohu se připojit k počítači se systémem Windows z prostředí Linux?

  1. Ssh – Přístup k linuxovému serveru z počítače se systémem Windows v grafickém režimu přes Ssh?

  2. Čtení souboru CSV s SQL dotazy z linuxového shellu

  3. Jak zaregistruji server Linux se serverem Windows DNS