3

我正在尝试在 bash 脚本中将 kdialog 与 sudo 一起使用,方法是将 SUDO_ASKPASS 导出到具有该行的脚本

kdialog --password "enter password: " 

并使用 sudo -A。这很好用,除了如果我在对话框中单击取消,sudo 会忽略它,并在延迟后重试密码输入。单行脚本以 kdialog 的退出状态退出,如果单击取消,则退出状态为非零。

有什么方法可以说服 sudo 放弃,就像在文本界面中输入 control-C 一样?

编辑-最终我弄清楚了发生了什么。如果单击取消,kdialog 会输出一个换行符。Sudo --askpass 将此解释为空白密码,并开始处理错误的密码。如果单击取消,则 askpass 脚本不得发出该换行符。一种方法是

pe=$(kdialog --password 'enter password: ') && echo "$pe"
4

1 回答 1

0

为此,经过几次尝试,我现在对SUDO_ASKPASS脚本使用以下解决方法:

#!/bin/bash

kdialog --password 'Enter password: ' || kill -9 "${PPID}"

如果用户选择取消,则调用进程(sudo 命令)将被终止。

如果您直接从命令行调用脚本,为了降低因错误杀死自己的进程的风险,您可以强化它:

#!/bin/bash

kdialog --password 'Enter password: ' || [ ! -z ${DIE_ON_CANCEL+x} ] && kill -9 "${PPID}"

然后,如果要在取消时终止进程,则DIE_ON_CANCEL必须像这样显式定义变量:

SUDO_ASKPASS='<your script>' DIE_ON_CANCEL=true sudo --askpass <your command here>

我不喜欢使用kill,但我没有看到任何其他解决方案。有人有更好的主意吗?

于 2021-05-16T17:03:04.197 回答