我最初使用$HOME
as登录/home/oleg
我需要使用 sudo 运行命令 - 这恰好是一个 npm install 命令 -
sudo npm install -g suman
但是,suman 模块的安装后脚本(如当前配置的那样)会写入原始用户的主目录/home/oleg/.suman
......但是因为我使用 sudo 运行上述 npm install 命令,所以我无权访问/home/oleg/.suman
.
是否有希望给予 root 用户访问该/home/oleg/.suman
目录的权限?
或者应该将 suman 的安装后脚本简单地安装到 root 用户的主目录中?
看起来,自从我写了 suman :),我就可以用 777 写 .suman 目录的内容,并以这种方式授予 root 用户完全访问权限。我想为 .suman 目录定义的最小文件权限是多少,以便仅向 root 用户和登录用户提供读/写/执行访问权限?
答案1
TL,DR:你的建议都不好。相反,当以 root 身份运行时,将状态文件存储在/var
(类似/var/lib/suman
)下。
root已经有权限了
root拥有访问系统中所有文件的权限。因此,不要更改目录的权限:这对 root 没有任何影响,但它允许其他人在该目录中读写。尽管人们普遍认为,chmod 777
做任何有用的事情是极其罕见的。
根有允许访问系统中的所有文件,通常这就足够了。有一些例外情况与某些文件系统类型有关,这些文件系统类型以不同于“正常”文件系统的方式处理用户。两个主要案例是:
- NFS:客户端上的 root 通常映射到服务器上的不同用户,通常是
nobody
.这意味着当 root 打开文件时,它是使用nobody
. - FUSE(包括 ecryptfs,通常用于加密主目录):除非另有配置(使用选项
allow_other
,只有 root 可以使用),FUSE 文件系统仅对安装它们的用户可用。
在这些情况下,尽管 root 具有明显的权限,但仍无法直接访问某些文件。 Root 仍然可以通过切换到拥有这些文件的帐户来有效地访问这些文件——这些是实现限制,而不是安全限制——但这有点不方便。
但 root 应该谨慎使用该权限
如果您有一个通常以 root 身份调用的程序,但设置HOME
为另一个用户的主目录,则应尽量避免在用户的主目录中创建该用户无法访问的文件。
如果/home/oleg/.suman
已经存在并且被 oleg 所有,那么你在那里写文件并不重要,因为目录的所有者总是可以删除该目录中的文件(需要的是写权限,所有者总是可以授予自己权限) 。当 oleg 运行相同的程序时,如果需要覆盖根拥有的文件,它将替换这些文件。但是,不要创建子目录:oleg 将无法访问它们或删除它们,即使它们是空的。
问题是,如果您第一次以 root 身份运行该程序,它会创建/home/oleg/.suman
.简而言之,不要这样做——问题是如何避免它。
解决方案
如果运行sudo -H
,则HOME
环境变量将设置为 root 的主目录,因此程序将无法访问/home/oleg
.
但有时以 root 身份运行程序(因为它需要 root 权限)但将主目录设置为您自己的目录(以读取配置文件)是有意义的。当然,这仅适用于以 root 身份运行的程序可以读取该配置文件的情况 - 用户界面自定义很好,但配置文件不应包含可执行代码之类的内容(例如,没有 shell 通过预处理转义)。如果是这样的话,程序应该读文件来自$HOME
但不写入。
如果程序需要存储一些状态文件,那么当它以 root 身份运行时,它应该将它们存储在系统目录(在 下/var
)中,而不是用户的主目录中。
答案2
您要寻找的是 sudo 的 -H, --set-home 参数。
从 sudo 手册页:
-H, --set-home 请求安全策略将 HOME 环境变量设置为目标用户的密码数据库条目指定的主目录。根据策略,这可能是默认行为。