因此,我正在编写一个脚本,我们称其chroot-session-builder
为安装具有单独操作系统的文件系统,然后将我登录到另一个文件系统中的 chrooted shell。它有效,但我是个混蛋,我希望它能很好地工作。
相关部分是这样的:
mkdir -p $mount_point/root/bin && \
cp chroot-env-setup.sh $mount_point/root/bin/ && \
chroot $mount_point bash -c /root/bin/chroot-env-setup.sh && \
chroot $mount_point
所以我已经通过了chroot-env-setup.sh
脚本。它运行并声明一些东西,问题点是:
export HOME=/root
export PATH=$PATH:/root/bin
## *** More functions...
## *** Calls to other scripts...
exit 0;
它退出 chroot 上下文并使我回到chroot-session-builder
shell 原始下一个调用的上下文中运行:
chroot $mount_point
带我进入我的 chroot 环境。
现在对我来说并不明显,直到我进行了一些测试并发现了这一点:如何正确添加路径到PATH?,发生的情况是该export
语句将变量公开给当前的 shell 会话。我感到困惑的原因是忽视了这$HOME
一点root
/root
无论如何。 (捂脸)因此,当我重新登录时,我声明的任何内容都会丢失。
我在这里看到两个潜在的选择:
1) 我可以写 canecho "export PATH:$PATH/root/bin" >>
到/root/.profile
, 当
这不需要我source /root/.profile
在重新进入 chroot 上下文后手动执行,因为新 shell 会在加载时从 /root/.profile 读取。
2)另一个选择是是否有办法chroot $mount_point <with a command>
从脚本中保留在 chroot 上下文中,以便脚本chroot-env-setup.sh
可以发挥其魔力,并且我不必担心重置环境更改或添加到文件? (我输入时所做的每个文件、设置调整,在保存文件系统之前,我必须考虑并添加到清理脚本中。)
答案1
我感觉你后续的问题源于你最初的问题(但我不能说,不容易读懂思路)
相关部分是这样的:
mkdir -p $mount_point/root/bin && \ cp chroot-env-setup.sh $mount_point/root/bin/ && \ chroot $mount_point bash -c /root/bin/chroot-env-setup.sh && \ chroot $mount_point
从该代码片段来看,我认为您的意思是在 chroot 环境中运行一个执行初始设置的脚本,然后使用交互式命令行进入 chroot 环境。
所以我已经通过了
chroot-env-setup.sh
脚本。它运行并声明一些东西,问题点是:export HOME=/root export PATH=$PATH:/root/bin ## *** More functions... ## *** Calls to other scripts... exit 0;
您还没有澄清,但我认为这代表了您的会话构建器脚本的内容?
如果是这样,那么 yes,export VARNAME=value
仅适用于它运行的 shell 会话或脚本,而不适用于调用它的会话。
该export
关键字允许子进程继承该变量,否则它严格保留在正在运行的会话/shell 脚本的范围内。环境变量永远不会向上冒泡到调用者的环境。这将是一个灾难性的操作问题,更不用说安全雷区了。
关于变量定义的放置位置:
所有用户都可以拥有一个~/.bashrc
和~/.profile
文件,即使root
,root
确实是一个用户,它只是拥有特殊权限和其他地方的主文件夹。
然而,您的 bash 会话将以HOME
当前设置的任何内容开始。调用时chroot
,需要提供预期目标HOME
- 添加
export PATH=$PATH:/root/bin
$mountpoint/root/.bashrc
- 也许还可以添加
echo Welcome to the chroot environment
相同的内容.bashrc
以查看其是否有效
- 也许还可以添加
- 当调用 chroot 时,您需要指定主文件夹 - 而不是在 chroot 内部:
HOME=/root chroot $mountpoint
事实上,您在同一行指定一个变量并调用一个命令。这会为该命令的环境设置变量,而不是当前的运行环境。
对于演示尝试
# Set var in current environment
MY_IS_SET=no
# Set var before calling env, which prints what its environment contains
MY_IS_SET=yes env | grep MY_IS_SET
# Check that current original environment is unchanged
echo $MY_IS_SET
您其余问题的答案应该从那里得出?