(编辑)
这似乎与https://github.com/maebert/jrnl/issues/478, 我犯了同样的错误。
抱歉我之前没注意到,当我在控制台中测试时,密钥环已经解锁了。我猜这意味着你不能从临时的 Python 命令中使用密钥环?
(/编辑)
这是您可以在 bash 脚本中使用 gnome 密钥环吗?如果可以,那么如何使用?
根据那里的回复,我在 bash 脚本中使用了这一行:
[[ -z $TARGET ]] || PASS=`python -c "import keyring; print(keyring.get_password(\"$TARGET\", \"(printf '%q' $USERNAME)\"))"`
除了第一次在会话中调用之外,此方法有效。然后它在 python 的密钥环密码提示仍在显示时返回,而我还没有来得及输入。结果,我在屏幕上同时收到两个密码提示,一个用于密钥环密码,另一个来自 yad。
在同一会话的稍后再次调用时,此行将返回存储的密码。
我试图做的是从密钥环获取用户 $USER 的密码,用于与 Windows 主机的 xfreerdp 会话(如果设置了 $TARGET),否则继续。下一步检查是否设置了 $PASS。如果没有,或者它包含“None”,它会启动 YAD 以显示一个对话框来提示输入密码。'%q' printf 格式允许在用户名(域\用户)中使用反斜杠。
当之前没有输入密钥环密码时,可以做些什么来阻止它吗?
如果有人感兴趣,这是完整的脚本。它旨在从其他脚本调用,并在变量 $\$USERVAR 和 $\$PASSVAR 中返回密码和用户名,因此实际变量名称可以由调用脚本传递。#echo 是我注释掉的调试助手。
#!/bin/bash
SAVE=FALSE
case $# in
1)
USERVAR=USER
PASSVAR=PASS
USERNAME=$1
;;
3)
USERVAR=$1
PASSVAR=$2
USERNAME=$3
;;
4)
USERVAR=$1
PASSVAR=$2
USERNAME=$3
TARGET=$4
;;
*)
echo '
getpasswd: invalid number of arguments.
Presents a username and password prompt dialog, with keyring support.
The user can accept the offered username or change it, and enter a password.
Use: getpasswd [usernamevar passwordvar] initial_username [targetname]
usernamevar defaults to USER
passwordvar defaults to PASS
User name and password will be returned in usernamevar and passwordvar
If targetname is specified,
- the password wil be taken from the keyring if the user/target combination exists.
- if the combination does not exist, the caller will be prompted
and given the option to store it in the keyring.
'
exit 1
;;
esac
#echo USERVAR=$USERVAR
#echo PASSVAR=$PASSVAR
#echo USERNAME=$USERNAME
#echo TARGET=$TARGET
[[ -z $TARGET ]] || PASS=`python -c "import keyring; print(keyring.get_password(\"$TARGET\", \"(printf '%q' $USERNAME)\"))"`
#echo from keyring: $PASS
if [[ -z $PASS || $PASS == "None" ]]
then
if [[ -z $TARGET ]]
then
FORM=$(yad --center --width=380 \
--window-icon="gtk-execute" --image="gcr-password"\
--title "Login" \
--form --field="User name" "$USERNAME"\
--field="Password":H\
--focus-field=2)
else
FORM=$(yad --center --width=380 \
--window-icon="gtk-execute" --image="gcr-password"\
--title "Login" \
--form --field="User name" "$USERNAME"\
--field="Password":H\
--field="Save in keyring?":CHK\
--focus-field=2)
printf -v SAVE "%s" $(echo $FORM | awk -F '|' '{ print $3 }')
fi
#echo $FORM
printf -v USERNAME "%s" $(echo $FORM | awk -F '|' '{ print $1 }')
printf -v PASS "%s" $(echo $FORM | awk -F '|' '{ print $2 }')
fi
#echo eval $USERVAR=$(printf '%q' $USERNAME)
#echo eval $PASSVAR=$(printf '%q' $PASS)
eval $USERVAR=$(printf '%q' $USERNAME)
eval $PASSVAR=$(printf '%q' $PASS)
#echo .
#echo TARGET=$TARGET
#echo USERNAME=$USERNAME
#echo PASS=$PASS
#echo SAVE=$SAVE
if [[ -n $TARGET && -n $PASS && $PASS != "None" && $SAVE != "FALSE" ]]
then
#echo saving to keyring
python -c "import keyring; keyring.set_password(\"$TARGET\", \"(printf '%q' $USERNAME)\", \"$PASS\")"
fi
将其称为(例如,根据需要替换名称和路径)
. getpasswd USER PASS domain\\user computername
[[ -z $PASS || $PASS == "None" ]] && exit 1
xfreerdp /v:hostname_or_ip /f /u:$USER /p:$PASS /cert-ignore +fonts /drive:ubuntu-home,$HOME /printer
答案1
我通过用 PERL 重写 python 命令使其按我想要的方式工作。我没有将其放在一行中,而是将其放在一个单独的文件中:
#!/usr/bin/perl
use Passwd::Keyring::Gnome;
print Passwd::Keyring::Gnome->new()->get_password($ARGV[0], $ARGV[1]);
它不是 100% 兼容的,我必须使用类似 set_password 的命令将密码重新存储在密钥环上。
它们出现在密钥环(Seahorse 中)中,其描述为“Passwd::Keyring 未分类密码/目标/用户名(由 Passwd::Keyring 提供)”,而不是“目标用户名的密码”。我无法通过操作 new() 的参数来找到旧密码,正如我所期望的那样。