取消sudo askpass请求

3

我正在尝试在bash脚本中使用带有sudo的kdialog,通过将SUDO_ASKPASS导出到一行脚本中来实现。

kdialog --password "enter password: " 

使用sudo -A命令可以正常运行,但是如果我在对话框中点击取消,sudo会忽略这个动作,并在延迟后重新尝试输入密码。一行脚本以kdialog的退出状态退出,如果点击取消,则其为非零值。

有没有办法让sudo放弃,就像通过输入control-C退出文本界面一样?

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

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

另一种选择是使用 $SUDO_ASKPASS=$(which ksshaskpass) - Noortheen Raja
@NoortheenRaja,在shell中,你不能在赋值语句的左侧使用$ - Charles Duffy
是的,我的错,我在Bash和Xonsh之间跳转。SUDO_ASKPASS=$(which ksshaskpass) - Noortheen Raja
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,但我没有看到其他解决方案。有人有更好的想法吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接