GNU/Linux >> Linux の 問題 >  >> Linux

pyodbc を使用して Linux から Windows SQL Server への認証を行う

これを機能させるには、Kerberos チケットを取得する必要があります。あなたの例では、Linux システムが Kerberos を介して認証するように設定されているかどうか、またはコードが接続文字列に到達する前に Kerberos チケットを以前に取得したかどうかを指定していません。

Linux システムが Kerberos 経由で認証するように設定されている場合、概念実証として、コマンド ラインから kinit を使用して Kerberos チケットを取得できます。 WSLを介してWindows上のUbuntuで実行されているpython3で機能するのは次のとおりです。 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')

これは、チケットを持っていない場合に表示されます。チケットを使用するため、スクリプトでユーザーまたはパスワードを指定する必要はありません。両方とも無視されます。

実行します:

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

この接続を確立する前に実行される Python コードから Kerberos チケットを取得することに成功することもありますが、それはこの回答の範囲を超えています。 Python Kerberos モジュールを検索すると、解決策が見つかるかもしれません。

ユーザーがログインするとすぐに、他のプロセスに渡すことができる Kerberos チケットを自動的に取得するように Linux システムをセットアップすることも可能です。これもこの回答の範囲外ですが、Linux ログイン時に自動 Kerberos チケットを検索すると、いくつかの手がかりが得られる場合があります。


FreeTDSドライバーの上に基本的にpyodbcであるpymssqlライブラリを使用することになりました。すぐに使えました。

不思議なことに、このライブラリを見つけるのにこんなに苦労した..


Linux
  1. Ssh – Sshを介してグラフィカルモードでWindowsマシンからLinuxサーバーにアクセスしますか?

  2. Linux上の外部SMTPサーバーを使用してコマンドラインからメールを送信する

  3. C#(.NETコア)を使用して、LinuxからWindows共有にファイルをコピーします

  1. Windows PC からリモート Linux サーバーに rsync を使用する方法は?

  2. Linux サーバーから Windows クライアントに SCP する方法

  3. Linux ボックスから Windows とインターネットを共有するにはどうすればよいですか?

  1. PuTTYを使用してWindowsからLinuxに接続する

  2. ドメイン登録されていないLinuxボックスからSQuirreL SQLを使用してSQL Serverに接続する方法は?

  3. LinuxシェルからのSQLクエリを含むCSVファイルの読み取り