在我们的网络中,所有用户和组 ID 都通过 NIS 从中央服务器分发,并且每个用户的$HOME
目录都位于该中央服务器上的已安装文件夹中。
显然,用户的 GID 不同于root
,因此root
无权访问已挂载的$HOME
文件夹,这使得用户很难(如果不是不可能的话)运行类似这样的操作,sudo apt update
因为这需要访问$HOME
所见sudo
。
我的问题是,我是否可以为需要访问的$HOME
文件和文件夹设置一个机器本地文件夹,而我的其他(非)工作则始终指向已安装的文件夹?sudo
$HOME
sudo
附加信息:
[user@machine ~]$ id
uid=544(user) gid=40(src) groups=40(src),101(systemd-journal)
[user@machine ~]$ sudo id
uid=0(root) gid=0(root) groups=0(root),40(src),101(systemd-journal),600(visitors),13010(hlcc),19016(identhw),51107(cadadm)
[user@machine ~]$ sh -c 'echo $HOME'
/net/server/home/user
[user@machine ~]$ sudo sh -c 'echo $HOME'
/net/server/home/user
我怎样才能将最后一行的结果(即的sudo
版本$HOME
)指向本地文件夹machine
而不是已挂载的网络路径?
编辑:
谢谢您的回答。结果发现我的问题几乎与unix.stackexchange.com 上的这个。
我还发现我遇到的问题apt-get update
实际上与环境变量无关,而是与我从我的( )主文件夹HOME
调用有关,类似于sudo apt-get update
user
这个问题sudo apt-get update
只需从另一个文件夹调用即可解决,例如/
。
但由于我的问题更多是关于HOME
看到的sudo
,所以我接受了techraf 的回答因为它不需要sudo
命令行中的任何额外的开关或定义。
答案1
如果您使用 sudo 调用,-i
您将获得 root 的主目录。
如果您希望 sudo 从当前环境继承,您可以将 home 设置为其他内容。
因此,要么使用,sudo -i command
要么执行HOME=/wherever sudo command
。
例如:
sudo -i sh -c 'echo $HOME'
这给你:
/root
或者:
HOME=/foo sudo sh -c 'echo $HOME'
这给你:
/foo
答案2
您需要将以下行添加到 sudoers 命令环境部分(带有sudo visudo
)。
Defaults env_keep -= "HOME"
然后您就可以不经任何修改地使用您的脚本。
sudo
Debian 和 Ubuntu 在命令默认处理HOME
变量(特别是这个变量,而不是整个环境)的方式上存在差异:
在 Debian 中,
HOME
值被替换为 root(目标用户)的主目录;Ubuntu 保留呼叫用户的设置。
Unix.SE 上的这个答案包含更多细节。