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

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

我读了社区“RootSudo”文档并且对此行感兴趣:

你应该绝不使用普通 sudo 以 Root 身份启动图形应用程序。

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

答案1

在 Ubuntu 19.10 及更高版本中,那篇文章(以及本答案中)不再适用。参见WinEunuuchs2Unix 的答案这个问题

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

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

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

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

sudo -H gedit

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

这仍然不会自动处理.Xauthoritysudo通过将其复制到临时文件夹(这是图形前端为您处理的另一件事)。但在偶尔.Xauthority无法访问的情况下,您会收到一条错误消息,指出无法访问,然后您可以通过删除它()来解决问题sudo rm ~/.Xauthority,因为它会自动重新生成。因此,保护.Xauthority​​ 的所有权和权限不如保护配置文件的所有权和权限重要。

root与-owned相比.Xauthority,当配置文件变为 时root,问题并不总是那么明显(因为图形程序通常会运行,但效果不佳,并将任何有用的错误输出到控制台)。有时修复起来会更麻烦,尤其是如果你希望你的主目录中的一个或多个文件归你以外的人所有(因为你不能通过简单地chown将所有文件递归回给自己来解决这个问题)。

因此,sudo(至少在没有的情况下-H)不应该用来运行图形应用程序除非您非常熟悉该应用程序的内部工作原理,并且确信它不会尝试写入任何配置文件。

答案2

简单的说:

这可以防止您的主目录中的文件被 root 拥有。

阅读这里。此外,可能重复“gksudo nautilus”和“sudo nautilus”有什么区别?

答案3

Ubuntu 19.10 更新

作为Ubuntu 19.10,输入 的sudo some_command效果现在与输入 相同sudo -H some_command。这意味着所触及的任何配置文件的目录都将位于/rootdirectory 下,而不是/home/regular_userIDdirectory 下(又名$HOME)。

对于 Ubuntu 19.10 及更高版本的用户来说,这在很大程度上使得整个问答变得毫无意义。

要查看它是否在您的发行版中sudo正常工作,sudo -H请尝试以下简短的测试:

$ sudo printenv | grep HOME
HOME=/home/rick

$ sudo -H printenv | grep HOME
HOME=/root

正如您所见,sudo上面的操作并不像sudo -H使用普通操作那样执行sudo,可能会损害您的用户配置文件。


或 的gksu nautilus替代方法是使用附加组件。它允许您使用gksu geditsudo -H geditnautilus-admin鹦鹉螺然后以 root (管理员) 身份打开它们。

安装非常简单:

sudo apt install nautilus-admin

现在,当您在 Nautilus 中时,您将有一个额外的选项来以管理员身份进行编辑:

鹦鹉螺管理员.gif


gedit因为 root 不允许首选项

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

为了解决这个问题,我编写了脚本sgedit来继承用户偏好并将其应用于根:我如何将我的根 gedit 与我的用户 gedit 的偏好设置同步?

  • 调用方式sgedit filename1 filename2 ...
  • 获取用户的制表位、字体、换行等 gedit 设置。
  • 提升至sudo -H获取根权限的同时保留文件所有权。
  • sudo如果上次超时则请求密码。
  • 获取 sudo 的 gedit 设置
  • 比较用户和 sudo gedit 设置之间的差异
  • 仅对差异运行 gsettings 设置(将 174 个设置命令减少到十几个或更少。下次运行时可能只有一两个更改,但通常没有更改。
  • 作为后台任务调用gedit,以便终端提示立即重新出现。

相关内容