答案1
在 Ubuntu 19.10 及更高版本中,那篇文章(以及本答案中)不再适用。参见WinEunuuchs2Unix 的答案也这个问题。
图形应用程序通常将设置和其他用户特定数据存储在用户内部编写的配置文件中主文件夹。应用程序用于确定应使用哪个文件夹作为用户主文件夹的主要机制是HOME
环境变量。(您可以使用 自行检查echo $HOME
)。
假设你正在跑步gedit
(图形文本编辑器)root
。如果你跑sudo gedit
,HOME
将继续指向你的主目录,即使程序正在运行作为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
)。
这仍然不会自动处理.Xauthority
sudo
通过将其复制到临时文件夹(这是图形前端为您处理的另一件事)。但在偶尔.Xauthority
无法访问的情况下,您会收到一条错误消息,指出无法访问,然后您可以通过删除它()来解决问题sudo rm ~/.Xauthority
,因为它会自动重新生成。因此,保护.Xauthority
的所有权和权限不如保护配置文件的所有权和权限重要。
root
与-owned相比.Xauthority
,当配置文件变为 时root
,问题并不总是那么明显(因为图形程序通常会运行,但效果不佳,并将任何有用的错误输出到控制台)。有时修复起来会更麻烦,尤其是如果你希望你的主目录中的一个或多个文件归你以外的人所有(因为你不能通过简单地chown
将所有文件递归回给自己来解决这个问题)。
因此,sudo
(至少在没有的情况下-H
)不应该用来运行图形应用程序除非您非常熟悉该应用程序的内部工作原理,并且确信它不会尝试写入任何配置文件。
答案2
答案3
Ubuntu 19.10 更新
作为Ubuntu 19.10,输入 的sudo some_command
效果现在与输入 相同sudo -H some_command
。这意味着所触及的任何配置文件的目录都将位于/root
directory 下,而不是/home/regular_userID
directory 下(又名$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 gedit
sudo -H gedit
nautilus-admin
鹦鹉螺然后以 root (管理员) 身份打开它们。
安装非常简单:
sudo apt install nautilus-admin
现在,当您在 Nautilus 中时,您将有一个额外的选项来以管理员身份进行编辑:
gedit
因为 root 不允许首选项
当您gedit
以 root 身份运行时,您无法使用作为普通用户设置的制表位、将制表符转换为空格、字体名称、字体大小、换行等首选项。
为了解决这个问题,我编写了脚本sgedit
来继承用户偏好并将其应用于根:我如何将我的根 gedit 与我的用户 gedit 的偏好设置同步?
- 调用方式
sgedit filename1 filename2 ...
- 获取用户的制表位、字体、换行等 gedit 设置。
- 提升至
sudo -H
获取根权限的同时保留文件所有权。 sudo
如果上次超时则请求密码。- 获取 sudo 的 gedit 设置
- 比较用户和 sudo gedit 设置之间的差异
- 仅对差异运行 gsettings 设置(将 174 个设置命令减少到十几个或更少。下次运行时可能只有一两个更改,但通常没有更改。
- 作为后台任务调用
gedit
,以便终端提示立即重新出现。