我见过现有的问题关于这一点,但答案仅指定使用别名,这会弄乱交互式 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"