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

Nur*_*Nur 125 gui sudo gksu

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

永远不应该使用普通的 sudo 以 Root 身份启动图形应用程序。

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

Eli*_*gan 136

在 Ubuntu 19.10 及更高版本中,该文章(以及本答案)中的警告不再适用。请参阅WinEunuuchs2Unix 的回答以及这个问题

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

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

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

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

sudo -H gedit
Run Code Online (Sandbox Code Playgroud)

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

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

root-owned 相比.Xauthority,当配置文件归为 时root,问题所在并不总是那么明显(因为图形程序通常会运行,但不能很好地运行,并且会向控制台输出任何有用的错误)。有时修复起来会更麻烦,特别是如果您希望主目录中的一个或多个文件归您以外的其他人所有(因为这样您就无法简单地通过递归地chown对所有文件进行修复)回到你自己)。

因此,sudo(至少没有-H)不应该用于运行图形应用程序,除非您非常熟悉应用程序的内部工作方式并确定它不会尝试编写任何配置文件。

  • @Wyatt8740 我绝对应该在上面的评论中写下 `chown` 而不是 `chmod`。对此感到抱歉——感谢您指出这一点! (3认同)
  • @TheQuark 在 `sudo -H echo $HOME` 中,你的 shell——以你的身份运行,而不是以 root 身份运行——执行 [参数扩展](https://www.gnu.org/software/bash/manual/bash.html #Shell-Parameter-Expansion) 在 `$HOME` 上,获取 *您的* 主目录的路径,然后将其传递给 `sudo`,后者又将已经扩展的值传递给 `echo`,后者将其打印出来。`sudo -H printenv HOME`、`sudo -H bash -c 'echo $HOME'` 和 `sudo -H sh -c 'echo $HOME'` 都打印 `/root`。这在概念上与 `x=a echo "$x"` 如何不打印 `a`(除非 `x` 已经具有值 `a`)类似——尽管采用不同的机制。 (2认同)

car*_*dil 28

简单的说:

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

在这里阅读。另外,可能是“gksudo nautilus”和“sudo nautilus”什么区别?


Win*_*nix 14

Ubuntu 19.10 更新

Ubuntu 19.10 开始sudo some_command现在输入与输入效果相同sudo -H some_command。这意味着触及的任何配置文件的目录都在/root目录下而不是/home/regular_userID目录下(又名$HOME)。

这使得整个问答在很大程度上对于 Ubuntu 19.10 及更高版本的用户来说是一个没有实际意义的问题。

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

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

$ sudo -H printenv | grep HOME
HOME=/root
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,sudo上面的表现并不像sudo -H这样使用普通sudo会损害你的用户配置文件。


的替代方法gksu nautilusgksu gedit或者sudo -H gedit是使用nautilus-admin附加组件。它允许您使用Nautilus浏览文件和目录,然后以 root(管理员)身份打开它们。

安装很简单:

sudo apt install nautilus-admin
Run Code Online (Sandbox Code Playgroud)

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

鹦鹉螺管理员.gif


gedit 作为 root 不允许首选项

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

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

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

  • 最好不要以 root 身份运行 gedit,而是使用 admin:///。这实际上就是 nautilus-admn 扩展的作用。使用非常简单的包装脚本,您也可以从命令行轻松完成此操作,请参阅我的回答 https://askubuntu.com/questions/1191075/how-to-open-a-text-file-in-current-工作目录与 gedit-admin/1191093#1191093 (2认同)