回答

回答

我想编写一个执行管理任务的脚本,并且我希望能够从终端或非终端运行它。如果它在终端中运行,即使是图形终端,我希望它使用 sudo 询问密码。如果它以其他方式运行(例如 Alt+F2 对话框),它应该使用 gksudo。有什么解决方案吗?


回答

基于以下内容,我得出了以下结论:

#!/bin/sh

SUDO="/usr/bin/sudo"

if [ -t 1 ]; then
  "$SUDO" "$@";
else
  gksudo -- "$SUDO" "$@";
fi

gksudo 稍微尴尬的情况是确保选项由 sudo 而不是 gksudo 解析,因为它们有不同的命令行选项。

答案1

env检查从终端运行和通过 GUI 启动时的输出。我猜 Gnome(或您正在使用的任何窗口管理器)正在添加一个或两个环境变量。

另一个选择是检查是否有与之关联的 tty,if [ -t 1 ]如下所示这个答案(请注意评论中的警告)。

答案2

我相信更常见的方法是简单地声明脚本需要 sudo 才能执行,如下所示:

sudo ./script_name.sh

这样,整个脚本就以管理员权限运行了。如果从安全模型的角度考虑,没有理由不让至少部分需要 sudo 的脚本以 sudo 运行。否则,这只会​​带来麻烦。

但是,如果您坚持只在某些部分使用 sudo,则可以将 sudo 放在实际的 bash 脚本中,它将提示输入密码并等待输入,直到继续执行脚本。在获得至少一个 sudo 密码输入后,所有后续 sudo 将保留提升的权限,并且不会再次提示输入密码。它还会让您的整个终端会话具有提升的权限,以便将来在脚本中未执行的 sudo 中使用。

至于 gksudo,我认为一个选项是告诉个人使用 alt-f2 运行对话框,而不是输入 sudo script_name.sh,而是输入 gksudo,然后单击“使用文件运行”按钮,让他们导航到并选择他们需要运行的脚本文件。我知道这很麻烦。希望有人有更优雅的解决方案。

答案3

if [ "$DISPLAY" ]; then
    gksudo foo
else
    sudo foo
fi

足够接近。

相关内容