3

我有一个 chroot 环境的小问题,希望你能帮助我:)

这是我的故事:

1 - 我创建了一个用户演示(有一个类似的家/home/demo),并通过如下脚本对他进行了 chroot /bin/chrootshell

#!/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 环境中,我用/bin/bashshell声明了我的演示用户

4

1 回答 1

2

据我所知,您遇到的行为是 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并且.bashrc如果作为登录 shell 启动,并且仅.bashrc在作为非登录 shell 启动时读取。现在你可以把需要做一次(登录时)的东西放进去,把.profile每次都需要做的东西放进去.bashrc

于 2012-11-27T12:03:01.107 回答