来自密钥环的密码:python get_password 在输入密钥环密码之前返回

来自密钥环的密码:python get_password 在输入密钥环密码之前返回

(编辑)

这似乎与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() 的参数来找到旧密码,正如我所期望的那样。

相关内容