如何从运行在 Cron Job 上的 Python 解锁 Gnome 密钥环



我正在连接一个 Python 脚本以使用 cron 运行(在 Ubuntu 12.04 上),但身份验证不起作用。

cron 脚本访问几个服务,并且必须提供凭据。使用 keyring 存储这些凭据非常简单,除了当 cron 作业实际运行时,无法检索凭据。脚本每次都失败。

据我所知,这与 cron 运行的环境有关。我追踪了一组帖子,这些帖子表明关键是将脚本导出DBUS_SESSION_BUS_ADDRESS。一切都很好,我可以得到那个地址,然后导出它,并相当容易地从Python获取它。但它只会生成一个新错误: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11 .设置DISPLAY=:0不起作用。

那么,有没有人想出如何从 Ubuntu 12.04 上运行的 Cron 作业上运行的 Python 解锁gnome-keyring

抱歉说我没有答案,但我想根据我正在处理的问题我知道一些正在发生的事情。我正在尝试让一个 Web 应用程序和 cron 脚本使用一些代码,这些代码使用 python-keyring 将 Google API 的 oauth 令牌存储到密钥环中。

无论我做什么,Web 应用程序和 cron 作业运行的环境都需要手动干预才能解锁密钥环。当您的代码在非交互式会话中运行时,这是不可能的。在尝试我的研究中建议的一些技巧时,问题仍然存在,例如为进程所有者提供与密钥环密码匹配的登录密码并将密钥环密码设置为空字符串。

我几乎可以保证你的错误源于 Gnome-Keyring 试图启动交互式(图形)提示和轰炸,因为你不能从 cron 做到这一点。

安装钥匙串:

sudo apt-get install keychain

把它放在你的$HOME/.bash_profile:

if [ -z "$SSH_AUTH_SOCK" ] ; then
  eval `ssh-agent -s`
fi
eval `keychain --eval id_rsa`

它将在首次登录时询问您的密码,并将存储您的凭据直到下次重新启动。

将其插入 cron 脚本的开头:

source $HOME/.keychain/${HOSTNAME}-sh

如果您使用其他语言(如 python),请从包装器脚本调用它。

它对我有用,我希望它也对你有帮助。

添加:

PID=$(pgrep -u <replace with target userid> bash | head -n 1)
DBUS="$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/"$PID"/environ | sed 's/DBUS_SESSION_BUS_ADDRESS=//' )"
export DBUS_SESSION_BUS_ADDRESS=$DBUS

在 crontab 中列出的脚本的开头对我有用。 我仍然需要在启动后以交互方式解锁一次密钥环,但重新启动并不频繁,因此它可以正常工作。

(来自 https://forum.duplicacy.com/t/cron-job-failed-to-get-value-from-keyring/1238/3)

因此,由 cron 运行的完整脚本将是:

#! /usr/bin/bash
PID=$(pgrep -u <replace with target userid> bash | head -n 1)
DBUS="$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/"$PID"/environ | sed 's/DBUS_SESSION_BUS_ADDRESS=//' )"
export DBUS_SESSION_BUS_ADDRESS=$DBUS
/home/user/miniconda/conda run -n myenv python myscript.py

使用 Conda 中的环境。 或者将 python 调用更改为将 python 设置为运行的方式。

最新更新