代码之家  ›  专栏  ›  技术社区  ›  Christian Madsen

像UAC一样自动调用gksudo

  •  6
  • Christian Madsen  · 技术社区  · 14 年前

    这是因为我在玩“A型命令,记住准备sudo,否则你的手指会被打”游戏时感到压力。

    我想知道是否有可能以某种方式配置我的Linux系统或shell,当我忘记键入“sudo-apt-get-install-emacs”时,gksudo会启动,让我承认我的证书并继续前进。就像UAC在Windows上做的那样。

    谷歌还没帮到我……

    这有可能吗?我错过什么了吗?还是我要一个正方形的圆?

    编辑2010年7月25日: 谢谢大家的关心。不幸的是,Daenyth和Bmargulies的答案和解释是我所期待/害怕的,因为在提交这个问题之前,我不可能通过谷歌搜索出一个解决方案。我希望有一天,有个好人能为这个问题提供一个有效的解决方案。

    Br 基督教的

    6 回复  |  直到 14 年前
        1
  •  0
  •   Daenyth    14 年前

    鉴于当前的Linux软件栈,没有办法做到这一点。此外, MS has a patent on this behavior —— present a user interface identifying an account having a right to permit a task in response to the task being prohibited based on a user's current account not having that right.

        2
  •  3
  •   bmargulies    14 年前

    Linux不允许这样做。与Windows不同的是,任何程序都可以启动一个对话框,UAC在内核中,Linux程序不一定支持GUI,而sudo在这个意义上不是内核。程序不能调用提升特权(除非它是以特权启动的,并且故意设置为关闭)。sudo是一个单独的具有setuid特权的可执行文件,用于检查权限。如果它喜欢它看到的内容,它会分叉外壳来执行命令行。这是不能翻出来的。

    正如在其他文章中所建议的,您可能会想出一些“shell游戏”来安排为您运行sudo以获得一些枚举的命令列表,但这就是您将要得到的全部内容。

        3
  •  1
  •   Karl Bielefeldt    14 年前

    您可以使用prexec hook函数执行您想要的操作,类似于命令not found包。

        4
  •  0
  •   nob    14 年前

    我不认为这真的是一个通用的方式(自动决定哪个应用程序需要管理权限)。但是,您可以为每个应用程序生成这样的别名:

    alias alias apt-get='gksudo apt-get'
    

    如果现在输入 apt-get install firefox 侏儒要求输入管理员密码。您可以将命令存储在 ~./bashrc

        5
  •  0
  •   RWS    14 年前

    您可以使用如下shell脚本:

    #!/bin/bash
    $@
    if [ $? -ne 0 ]; then
        sudo $@    # or "gksudo $@"
    fi
    

    如果命令返回时返回非零返回代码(即如果失败),那么将运行参数中带有sudo前缀的命令。 例如,在“script_name apt get install emacs”中使用它。您可以将其保存在$path中的某个位置,并将其设置为如下别名(如果您将其保存为do-sudo):

    alias apt-get='do_sudo apt-get'
    

    编辑: 确实如此 为类似的程序工作 synaptic 哪一个 为非根用户工作,但会给他们更少的特权。但是,如果在没有根权限的情况下调用应用程序时失败(如 apt-get 是的)这个很好用。

        6
  •  0
  •   Donal Fellows    14 年前

    在这种情况下,您希望始终以根用户身份运行命令,但可能已经 根目录,您可以通过在它周围包装一个小bash脚本来解决这个问题:

    #!/bin/bash
    if [ $EUID = 0 ]; then
        "$@"
    else
        gksudo "$@"
    fi
    

    如果你把这个叫做 alwaysroot.bash 把它放在你路径上的正确位置,然后你可以这样调用你的其他程序:

    alwaysroot.bash otherprogram -arguments...
    

    它甚至可以正确地处理带有空格的参数。