Запрашивать возможно кэшированный пароль в Expect

#tcl #expect

#tcl #ожидать

Вопрос:

Я хотел бы сделать что-то вроде

 systemd-ask-password --keyname=domain:pw --accept-cached Password:
  

от Expect. Эта команда отлично работает с терминала, чтобы либо вернуть кэшированный пароль, если он уже существует, либо запросить его, а затем кэшировать его. Однако мне не удалось найти способ заставить его взаимодействовать expect .

 send "systemd-ask-password --keyname=domain:pw --accept-cached Password:r"
  

не создает выходных данных для взаимодействия и

 spawn "systemd-ask-password --keyname=domain:pw --accept-cached Password:r"
  

говорит ": no such file or directory... , что подразумевает, что порожденный процесс даже не использует ту же связку ключей.

Я был бы счастлив использовать более низкий уровень keyctl , но у меня те же результаты, что и с этим

Какой правильный синтаксис для создания systemd-ask-password или keyctl запроса в tty?

Ответ №1:

Я думаю, вы имеете в виду запустить команду, используя tty, в котором вы находитесь в данный момент. Это можно сделать с помощью exec . Например, следующее взаимодействие с оболочкой ( **** где я ввел none ):

 $ cat <<! >myprog
set pw [exec systemd-ask-password --keyname=domain:pw --accept-cached Password:]
send_user "you said pw=$pwn"
!
$ expect myprog
Password: ****
you said pw=none
$ expect myprog
you said pw=none
  

Комментарии:

1. Это абсолютно идеально. Я раньше не видел set variable [...] синтаксиса.

Ответ №2:

Если бы я должен был сделать это как отдельную вещь для запуска в качестве порожденного подпроцесса, я бы ожидал его запуска с чем-то вроде этого:

 spawn systemd-ask-password --keyname=domain:pw --accept-cached Password:
  

Единственная причина для send изменения этого была бы в том, что есть управляемая оболочка, которой мы хотим, чтобы она выполняла это для нас (возможно, потому, что она будет запущена на удаленном компьютере).).

Вероятно, потребуется автоматизировать обработку возможного запроса пароля и управление результатом. Конечно. Но для тестирования введите interact команду после этого spawn , чтобы вы могли напрямую обращаться к подпроцессу (как если бы он был).

Комментарии:

1. Как я уже сказал, я использовал spawn . Кажется, он даже не смотрит в нужную связку ключей, но, тем не менее, он также не запрашивал.