问题描述
gksu foo
和gksudo foo
的行为有什么区别吗?它们可以互换使用吗?
最佳解决方法
两个文件都指向同一个地方:
$ ls -l /usr/bin/gksudo
lrwxrwxrwx 1 root root 4 2010-09-27 18:23 /usr/bin/gksudo -> gksu
… gksudo
与gksu
符号链接。但这并不意味着他们做同样的事情,远非如此。
应用程序可以检测用于运行它的命令。这通常是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
)到达libgksu
,it will check Gconf (as Stefano points out)时,如果它仍然无法确定,则它将默认为su
模式。
次佳解决方法
在Ubuntu(!)中,没有区别。
-
gksu
通常会登录root用户并在此会话上运行应用程序。但是,在Ubuntu上,它默认使用”sudo mode”,相当于运行gksudo
。这是因为在ubuntu上,你默认使用can’t log in as root。 -
gksudo
是sudo
的图形等效物(正如Oli指出的那样,只是gksu的符号链接)
从gksu的gconf条目:
此外,关于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关于gksu
和gksudo
之间的微妙但本质区别。
虽然我看起来很长很难,但我无法在任何地方找到记录的差异,但它确实存在。我也没有发现为什么会有区别。当我意外删除一些系统文件时,我发现这很难,因为这种差异(在thread in Ubuntu Forums中讨论) – 我一直在使用gksu
,但从那时起我一直确保使用gksudo
。
总而言之,试试这个。
-
在某个文件夹中创建三个文件:
touch abc
touch abc.tmp
touch abctmp
-
运行以下六个命令。前五个给出相同的(预期的)结果(即只是
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
。