连接到 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
我有一个 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