始终使用 sudo Askpass 除非从交互式 shell 调用

始终使用 sudo Askpass 除非从交互式 shell 调用

我见过现有的问题关于这一点,但答案仅指定使用别名,这会弄乱交互式 shell,并且不适用于使用 exec() 或类似方法的应用程序。我真的不想将 sudo 可执行文件移动到 /usr/bin 中,因为这会使升级变得困难,但我真的不知道还能如何做到这一点。我还希望它在从 shell 脚本调用时使用askpass。

答案1

您可以检查是否当前 bash 实例是交互式的。然而,这可能不适用于其他 shell。

现在,如果您创建代理脚本,您可以封装如何启动的决定sudo。命名它sudoAskpass.sh,例如:

#!/bin/bash

BASH_PARAMETERS="$1"
shift

case "${BASH_PARAMETERS}" in
    *i*)
        sudo -A "$@"
        ;;
    *)
        sudo "$@"
        ;;
esac

exit $?

尽管如此,您仍然需要别名sudo,因为在脚本中参数$-指示非交互式 shell:

alias sudo='/path/to/sudoAskpass.sh "$-"'

答案2

我想出了怎么做。首先,创建一个在路径sudo之前的某个位置调用的脚本,/usr/bin其中包含以下内容:

#!/bin/bash

/usr/bin/sudo -A "$@"

这只是将其参数传递给真正的 sudo,但附加了 -A 参数。然后,在/etc/zshrc(或 shell 的系统范围 rc 文件)中,将别名设置回原始 sudo:

alias sudo="/usr/bin/sudo"

相关内容