(РЕДАКТИРОВАНИЕ)
Это, кажется, связано с https://github.com/maebert/jrnl/issues/478, я получаю ту же ошибку.
Извините за не замечать его ранее, был уже разблокирован брелок для ключей, когда я тестировал его в консоли. Я предполагаю, что это означает, что Вы не можете использовать брелок для ключей от специальной команды Python?
(/РЕДАКТИРОВАНИЕ)
Это - последующий вопрос Вам, может использовать брелок для ключей гнома в сценарии удара, если да затем как?
На основе ответа там, я использую эту строку в сценарии удара:
[[ -z $TARGET ]] || PASS=`python -c "import keyring; print(keyring.get_password(\"$TARGET\", \"(printf '%q' $USERNAME)\"))"`
Это работает, за исключением первого раза это называют на сессии. Затем это возвращается, в то время как подсказка пароля брелока для ключей Python все еще отображается, прежде чем у меня было время для ввода его. В результате я получаю две подсказки пароля на экране одновременно, один для пароля брелока для ключей и один от yad.
Названный снова позже на той же сессии, эта строка возвращается, сохраненный пароль как она должен.
То, что я пытаюсь сделать, получают пароль для пользовательского $USER, для xfreerdp сессии к хосту Windows, от брелока для ключей, если $TARGET установлен, или только продолжите иначе. Следующий шаг проверяет, установлен ли $PASS. В противном случае или если это не содержит 'Ни один', это запускает YAD для отображения диалогового окна для запроса его. '%q' printf формат должен допускать обратную косую черту в имени пользователя (domain\user).
Что-то может быть сделано для создания этого блокированием, когда пароль брелока для ключей не был введен ранее?
В случае, если кому-то интересно, это - полный сценарий. Это предназначается, чтобы быть названным из других сценариев и возвращает пароль и имя пользователя в переменных $\\$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
Я заставил это прокладывать себе путь, я разыскиваемый перезаписью Python управляю в Perl. Вместо одной строки я поместил его в отдельный файл:
#!/usr/bin/perl
use Passwd::Keyring::Gnome;
print Passwd::Keyring::Gnome->new()->get_password($ARGV[0], $ARGV[1]);
Это не на 100% совместимо, я должен восстановить пароли на брелоке для ключей с помощью подобной команды с set_password.
Они появляются в брелоке для ключей (у Морского конька) с описанием как 'Passwd:: Брелок для ключей несекретные пароли/цель/имя пользователя (Passwd:: Брелок для ключей)' вместо 'Пароля для имени пользователя на цели'. Я не мог заставить это находить старые пароли путем проигрывания с аргументами новому () также, как я так или иначе ожидал.