我有一个chroot环境的小问题,我希望你能帮助我:)
这是我的故事:
1 - 我创建了一个用户演示(有一个像/home/demo
这样的家),由于脚本/bin/chrootshell
,我为他chroot,如下:
#!/bin/bash
exec -c /usr/sbin/chroot /home/$USER /bin/bash --login -i
2 - 此用户禁用了常用的登录验证,因此我必须使用su - demo
作为他登录
一切都运行良好(像所有chrooted系统命令或我的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 env中,我用/bin/bash
shell声明我的演示用户
据我所知,你所遇到的行为是bash按设计工作。
简而言之:当bash作为登录shell启动时(即当你使用--login调用bash时会发生这种情况)它会读取.profile
而不是.bashrc
。当bash作为非登录shell启动时,bash将读取.bashrc
但不读取.profile
。
有关更多信息,请阅读有关startup files的bash手册章节。
我建议解决这个设计决定是创建一个.bash_profile
,其中包含以下内容:
if [ -f "~/.profile" ]; then
source "~/.profile"
fi
if [ -f "~/.bashrc" ]; then
source "~/.bashrc"
fi
如果作为登录shell启动,这将使bash读取.profile
和.bashrc
,如果作为非登录shell启动,则只读取.bashrc
。现在你可以把需要在.profile
中完成一次(登录时)的东西,以及每次需要在.bashrc
中完成的东西。