Anda harus mendapatkan tiket Kerberos agar ini berfungsi. Contoh Anda tidak menentukan apakah sistem Linux Anda disiapkan untuk mengautentikasi melalui Kerberos atau apakah Anda sebelumnya telah mendapatkan tiket Kerberos sebelum kode Anda mencapai string koneksi Anda.
Jika sistem Linux Anda diatur untuk mengautentikasi melalui Kerberos, maka sebagai bukti konsep Anda dapat memperoleh tiket Kerberos menggunakan kinit dari baris perintah. Inilah yang bekerja untuk saya di python3 berjalan di Ubuntu pada Windows melalui WSL. Kode 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')
Ini memberitahu Anda jika Anda tidak memiliki tiket. Karena menggunakan tiket, Anda tidak perlu menentukan pengguna atau kata sandi dalam skrip. Ini akan mengabaikan keduanya.
Sekarang kita jalankan:
[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]:~#
Anda mungkin juga berhasil mendapatkan tiket Kerberos dari kode python yang berjalan sebelum Anda membuat koneksi ini, tetapi itu di luar cakupan jawaban ini. Pencarian untuk modul python Kerberos mungkin mengarahkan Anda ke solusi.
Tampaknya juga mungkin untuk mengatur sistem Linux sehingga segera setelah pengguna masuk, secara otomatis mendapatkan tiket Kerberos yang dapat diteruskan ke proses lain. Itu juga di luar cakupan jawaban ini, tetapi pencarian tiket Kerberos otomatis saat login Linux dapat menghasilkan beberapa petunjuk.
Saya akhirnya menggunakan perpustakaan pymssql yang pada dasarnya adalah pyodbc di atas driver FreeTDS. Itu berhasil di luar kotak.
Aneh betapa sulitnya saya menemukan perpustakaan ini..