如何使用 chroot 来解释 shell 会话环境变量、上下文

如何使用 chroot 来解释 shell 会话环境变量、上下文

因此,我正在编写一个脚本,我们称其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-buildershell 原始下一个调用的上下文中运行:

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

  1. 添加export PATH=$PATH:/root/bin$mountpoint/root/.bashrc
    • 也许还可以添加echo Welcome to the chroot environment相同的内容.bashrc以查看其是否有效
  2. 当调用 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

您其余问题的答案应该从那里得出?

相关内容