为什么用户永远不要使用普通的sudo启动图形应用程序?


114

我已经阅读了社区“ RootSudo”文档,并对这一行感兴趣:

你应该永远不会使用普通的sudo来启动图形应用程序的根。

为什么?有什么区别?请提供简单的说明,因为我只是普通的桌面用户。



实际上,最近我很难将MATLAB安装到/ usr / local。这需要root特权才能写入/ usr / local,但是使用gksu运行安装程序会以某种方式使以非root用户身份运行已安装程序成为不可能。使用sudo运行安装程序使一切正常。
围兜迷失了

Answers:


129

图形应用程序通常将设置和其他特定于用户的数据存储在写入用户主文件夹内的配置文件中。应用程序用来确定用户主文件夹应使用的主要机制是HOME 环境变量。(您可以自己检查echo $HOME)。

假设您gedit以的身份运行(图形文本编辑器)root。如果您运行sudo gedit,即使程序运行HOME它将继续指向您的主目录。因此,会将配置文件作为原始目录写入。这有时会导致在配置文件中所拥有,因而无法访问你(当你在以后运行程序为自己,而不是为)。这主要在应用程序必须创建新的配置文件时发生。默认情况下,新创建的文件由创建它们的用户拥有(在这种情况下为,而不是您)。rootgeditrootrootrootroot

这就是为什么您应该使用图形sudo前端而不是straight 运行图形应用程序的主要原因sudo。在Ubuntu及其大多数派生工具(包括Xubuntu和Lubuntu)中,标准图形前端为gksu/gksudo。在Kubuntu是kdesudo。(这取决于所使用的桌面环境。)

如果您sudo直接使用来运行类似的图形应用程序gedit,则可以运行:

sudo -H gedit

-H标志使sudo设置HOME为指向root的主文件夹(这是/root)。

仍然不能通过.Xauthority将其复制到临时文件夹来自动处理所有权(这是图形sudo前端为您处理的另一件事)。但是在.Xauthority无法访问的偶发事件中,您会得到一个错误提示,说它是,然后您可以通过删除它(sudo rm ~/.Xauthority)来解决问题,因为它会自动重新生成。因此,保护.Xauthority的所有权和权限比保护配置文件的所有权和权限重要。

root-own相比.Xauthority,当配置文件作为拥有时root,问题并不总是那么明显(因为图形程序通常会运行,但不能很好地工作,并向控制台输出任何有用的错误)。有时修复起来比较麻烦,尤其是在您希望主目录中的一个或多个文件归您以外的其他人拥有的情况下(因为那样您就不能简单地通过递归地chown处理所有文件来修复它)回到自己)。

因此,除非您对应用程序的内部工作非常熟悉并且确定知道它永远不会尝试编写任何配置文件,否则sudo(至少不使用-H)不应用于运行图形应用程序。


如果这些文件已由root拥有,我是否可以再次成为主目录中所有配置文件(或任何文件)的所有者?
2013年

@Nur假设有没有在你的home目录,你的文件通过任何其他用户所拥有或想要有任何其他组成员(分享),你可以运行:sudo chmod -R $USER:$USER ~不幸的是,这些标准并不一定适用。如果有任何文件需要保留组所有者,则可以运行sudo chmod -R $USER ~。通常这足够了。(如果您的文件需要由主目录中的其他用户拥有,那将是一个问题。)
Eliah Kagan

1
@EliahKagan chmod确实做到了吗?我一直以为是chown这样做的。chmod从来没有为我做过。
Wyatt8740 2015年

2
@ Wyatt8740我绝对应该写,chown而不是chmod在上面的评论中。抱歉-感谢您指出这一点!
伊利亚·卡根

2
@TheQuark在sudo -H echo $HOME,你的壳-运行如你,还不如根-进行参数扩展$HOME,获取的路径你的主目录,然后传递,要sudo,这反过来又通过了已膨胀值echo,打印它。sudo -H printenv HOMEsudo -H bash -c 'echo $HOME'sudo -H sh -c 'echo $HOME'所有打印/root。这在概念上与x=a echo "$x"不打印方式a(尽管x已具有值a)在概念上相似(尽管通过不同的机制)。
埃利亚·卡根


5

一种替代gksu nautilusgksu gedit是使用nautilus-admin附加。它允许您使用Nautilus浏览文件和目录,然后以root用户(管理员)身份打开它们。

安装简单明了:

sudo apt install nautilus-admin

现在,当您在鹦鹉螺中时,将有一个额外的选项以管理员身份编辑:

鹦鹉螺admin.gif


gedit 作为root不允许使用偏好

当您gedit以root用户身份运行时,您无法使用作为普通用户设置的首选项来制表位,将制表符转换为空格,字体名称,字体大小,换行等。

为了解决这个问题,我编写了脚本sgedit来继承用户首选项并将其应用于root:如何将root gedit与用户gedit的首选项同步?

  • 致电使用 sgedit filename1 filename2 ...
  • 获取用户的制表符设置,制表符,字体,换行符等的设置。
  • 提升为sudo -H保留文件所有权,同时获得root权限。
  • 如果最后一次sudo超时,则请求密码。
  • 获取sudo的gedit设置
  • 比较用户和sudo gedit设置之间的差异
  • 仅运行在差异上设置的gsettings(将174个set命令减少到一打或更少。下一次运行时,也许只更改一两个即可,但通常不更改。
  • gedit作为后台任务进行调用,以使终端提示立即重新出现。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.