ubuntu 如何从运行在Cron Job上的Python中解锁Gnome Keyring?

k4ymrczo  于 2023-01-25  发布在  Python
关注(0)|答案(3)|浏览(159)

我正在连接一个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吗?

col17t5w

col17t5w1#

我很抱歉地说,我没有答案,但我想我知道一点是怎么回事基于一个问题,我正在处理。我试图让一个web应用程序和cron脚本使用一些代码,隐藏一个oauth令牌谷歌的API到一个keyring使用python-keyring。
不管我怎么做,运行web应用和cron作业的环境需要手动干预才能解锁keyring。当你的代码在非交互式会话中运行时,这是不可能的。当尝试我的研究中建议的一些技巧时,问题仍然存在,比如给进程所有者一个与keyring密码匹配的登录密码,并将keyring密码设置为空字符串。
我几乎可以保证你的错误源于Gnome-Keyring试图启动一个交互式(图形)提示和轰炸,因为你不能从cron中做到这一点。

rjee0c15

rjee0c152#

安装钥匙串:

sudo apt-get install keychain

将其放入您的$HOME/.bash_配置文件:

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

它会在第一次登录时询问您的密码,并会存储您的凭据,直到下次重新启动。
将其插入到cron脚本的开头:

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

如果使用其他语言,如Python,请从 Package 器脚本调用它。
对我很有效,希望对你也有帮助。

bmp9r5qi

bmp9r5qi3#

增加:

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中列出的脚本的开头对我很有效。我仍然需要在启动后交互式地解锁一次keyring,但重新启动不频繁,所以它工作正常。
(from 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运行的方式。

相关问题