我对chroot环境有一点问题,希望你能帮我:)
这是我的故事:
1 - 我创建了一个用户演示(像/home/demo
这样的家),我通过一个脚本/bin/chrootshell
对他进行了追捧,如下所示:
#!/bin/bash
exec -c /usr/sbin/chroot /home/$USER /bin/bash --login -i
2 - 此用户禁用了通常的登录身份验证,因此我必须使用su - demo
才能以他的身份登录
一切运行良好(就像所有 chroot 系统命令或我的 java 配置一样)。但是每次我成为用户演示时,似乎我的 .bashrc 或/etc/profile 都没有来源......我不知道为什么。
但是,如果我启动手动 bash 它的工作原理,如下所示:
root@test:~# su - demo
bash-4.1$ env
PWD=/
SHELL=/bin/chrootshell
SHLVL=1
_=/bin/env
bash-4.1$ bash
bash-4.1$ env
PWD=/
SHLVL=2
SHELL=/bin/chrootshell
PLOP=export variable test
_=/bin/env
如您所见,我的$PLOP
变量(在/.bashrc ==/home/demo/.bashrc 中描述)在第二个 bash 中设置得很好,但我不知道为什么
如果您对我的问题有任何线索,请提前感谢您:)
编辑:我实际上不明白的是为什么SHELL=/bin/chrootshell
? 在我的 chroot 环境中,我用 shell 声明/bin/bash
演示用户
据我所知,您正在经历的行为是按设计工作。
简而言之:当 bash 作为登录 shell 启动时(这就是使用 --login 调用 bash 时发生的情况),它将读取.profile
但不会读取.bashrc
。当 bash 作为非登录 shell 启动时,bash 将读取.bashrc
但不会读取.profile
。
有关详细信息,请阅读有关启动文件的 bash 手册章节。
我建议围绕此设计决策创建一个包含以下内容的.bash_profile
:
if [ -f "~/.profile" ]; then
source "~/.profile"
fi
if [ -f "~/.bashrc" ]; then
source "~/.bashrc"
fi
这将使 bash 读取.profile
,如果作为登录 shell 启动,则.bashrc
,如果作为非登录 shell 启动,则只读取.bashrc
。现在你可以把需要做一次(登录期间)的事情放在.profile
,每次需要做的事情放在.bashrc
我遇到了同样的问题,并找到了解决方案:似乎,如果你chroot
非root用户,chroot
的bash
仍然只寻找.bash_profile
,.bashrc
和/或.profile
,在chroot目录内寻找一个/root
目录。把这些文件放在那里,它就会起作用。