当前位置: 首页>>技术问答>>正文


gksudo和gksu有什么区别?

, ,

问题描述

gksu foogksudo foo的行为有什么区别吗?它们可以互换使用吗?

最佳解决方法

两个文件都指向同一个地方:

$ ls -l /usr/bin/gksudo 
lrwxrwxrwx 1 root root 4 2010-09-27 18:23 /usr/bin/gksudo -> gksu

gksudogksu符号链接。但这并不意味着他们做同样的事情,远非如此。

应用程序可以检测用于运行它的命令。这通常是C-style语言中的argv[0]或Bourne-style shell脚本中的$0。应用程序可以查看它,在这种情况下,实际上它会改变它的工作方式。第一个迹象是在man gksu页面中:

gksu  is  a  frontend  to  su  and gksudo is a frontend to sudo.

如果您查看run_mode的源代码(apt-get source gksu),您将看到它如何检测到:

  { /* support gksu_sudo_run */
    gchar *myname = g_path_get_basename (argv[0]);
    if (!strcmp(myname, "gksudo"))
      run_mode = SUDO_MODE;
    g_free (myname);
  }

您可以使用--su-mode /-w--sudo-mode /-S参数覆盖它(这样您就可以运行等效命令而无需gksudo符号链接……但这取决于您。

如果你想知道这些”modes”真的有什么不同,那么在gksu中只有一些转义。您需要将其关注到libgksu中。这是在切换到系统之前实际​​检查权限的库。

如果没有指定模式(例如,在没有参数的情况下调用gksu)到达libgksuit will check Gconf (as Stefano points out)时,如果它仍然无法确定,则它将默认为su模式。

次佳解决方法

在Ubuntu(!)中,没有区别。

  • gksu通常会登录root用户并在此会话上运行应用程序。但是,在Ubuntu上,它默认使用”sudo mode”,相当于运行gksudo。这是因为在ubuntu上,你默认使用can’t log in as root

  • gksudosudo的图形等效物(正如Oli指出的那样,只是gksu的符号链接)

从gksu的gconf条目:

gksu,gksudo,ubuntu

此外,关于sudo和gksudo之间的区别:

You should never use normal sudo to start graphical applications as root. You should use gksudo (kdesudo on Kubuntu) to run such programs. gksudo sets HOME=~root, and copies .Xauthority to a tmp directory. This prevents files in your home directory becoming owned by root. (AFAICT, this is all that’s special about the environment of the started process with gksudo vs. sudo).
 — (from the community documentation via Chris Wilson)

第三种解决方法

我知道这是一个旧线程,但我已经在asked to tell you关于gksugksudo之间的微妙但本质区别。

虽然我看起来很长很难,但我无法在任何地方找到记录的差异,但它确实存在。我也没有发现为什么会有区别。当我意外删除一些系统文件时,我发现这很难,因为这种差异(在thread in Ubuntu Forums中讨论) – 我一直在使用gksu,但从那时起我一直确保使用gksudo

总而言之,试试这个。

  1. 在某个文件夹中创建三个文件:touch abc touch abc.tmp touch abctmp

  2. 运行以下六个命令。前五个给出相同的(预期的)结果(即只是abc.tmp),而第六个包括不应该的额外文件(abctmp)。

    find . -regextype posix-egrep -regex '.*\.tmp' -print
    sudo find . -regextype posix-egrep -regex '.*\.tmp' -print
    gksudo -- find . -regextype posix-egrep -regex '.*\.tmp' -print
    gksudo --su-mode -- find . -regextype posix-egrep -regex '.*\.tmp' -print
    gksu --sudo-mode -- find . -regextype posix-egrep -regex '.*\.tmp' -print
    gksu -- find . -regextype posix-egrep -regex '.*\.tmp' -print
    

想象一下在find命令中用-delete替换-print时的问题(这正是发生在我身上的事情,导致一些系统文件被删除)。

因此,请使用gksudo代替gksu

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/1246.html,未经允许,请勿转载。