连接到 SQL 服务器的 MacOS 10.14 上的 pyodbc,cron 作业失败

pyodbc on MacOS 10.14 connecting to SQL Server, fails with cron job

我有一个 python3 脚本,我 运行 在 MacOS 10.14 上使用 pyodbc 连接到 SQL 服务器数据库。当我手动 运行 它时,它工作正常,但是当我用 crontab 安排它时,我得到这个错误:

'DRIVER=/usr/local/lib/libmsodbcsql.17.dylib;' pyodbc.Error: ('HY000','[HY000] [Microsoft][ODBC Driver 17 for SQL Server]SSPI Provider:  No credentials were supplied, or the credentials were unavailable or inaccessible. (458752) (SQLDriverConnect)')

我运行宁作为托管用户,通过 AD 连接,我的帐户有权使用这些凭据访问数据库。

这是python:

#!/usr/bin/env python

import pyodbc

conn = pyodbc.connect(
  'DRIVER=/usr/local/lib/libmsodbcsql.17.dylib;'
  'SERVER=[SERVER NAME];'
  'DATABASE=[DATABASE];'
  'Trusted_Connection=yes;'
)

cursor = conn.cursor()
cursor.execute("SELECT * FROM [TABLE]")

当然有适当的服务器、数据库和 table。

我认为这与托管用户和 cron 用户之间的细微差别有关,但我不知道如何解决该问题。出于安全原因,为该服务器创建一个 SQL 托管帐户是行不通的。

错误消息告诉您需要凭据。添加 UID=username;PWD=password 到 pyodbc.connect 字符串参数,例如,

pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+ password)

您可能正在使用默认 root 用户设置您的 crontab,该用户可能没有与其关联的活动目录凭据。尝试使用 crontab -u <username> 设置您的 crontab,使用您能够手动 运行 脚本成功使用的相同用户名。查看此答案以获取更多详细信息:

运行 os ping 命令前后在您的代码中,ping 的目标是数据库和服务器名称。在 cmd 框中使用相同的数据库和服务器名称执行 ping 命令 shell 脚本并与 SQL 中的连接脚本进行比较。使用结果修改您的代码。


#Look at the subprocess module in the standard library:
import subprocess
subprocess.run(["ping <server Name>", "-l"])

尝试在您的帐户下创建一个 cron 作业。我在 centos 上测试它对我有用。

cron 作业 运行 作为系统并且不再访问 mac 上的用户凭据(好吧,它已被删除)。

您需要使用 launchd 代替 运行 用户代理。

基本步骤是

为其创建作业定义 .plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>Label</key>
        <string>local.myJob</string>
        <key>Program</key>
        <string>/Users/user/Scripts/myScript.py</string>
        <key>RunAtLoad</key>
        <true/>
    </dict>
</plist>

将 .plist 保存到 ~/Library/LaunchAgents/local.myJob.plist 这使它成为用户代理而不是系统守护进程。

将脚本放在.plist Program Key指定的位置

将作业添加到 launchd

launchctl load ~/Library/LaunchAgents/local.myJob.plist

开始于

launchctl start local.myJob