在Expect中要求一个可能缓存的密码

问题描述

我想做些类似的事情

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,但与此同时我得到了相同的结果

在tty上显示systemd-ask-passwordkeyctl的正确语法是什么?

解决方法

我认为您的意思是使用当前所在的tty运行命令。这可以使用exec完成。例如,以下外壳交互(****是我键入none的位置):

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

如果我要作为独立的事情来作为生成的子进程来运行,那么我期望使用以下方式启动它:

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

send这样做的唯一原因是,如果有一个受控制的外壳,我们希望它为我们执行该外壳(也许是因为它将在远程计算机上运行)。

可能需要自动处理可能的询问密码并管理结果。当然。但是为了进行测试,请在该interact之后放置一个spawn命令,以便您可以直接与子流程进行对话。