我正在编写一个脚本来自动化我的 Arch Linux 安装过程,但我遇到了一个环境问题。我有一个包含安装顺序的文件和一个包含所有功能的文件,这些功能源自脚本的开头。
运行arch-chroot /mnt /bin/bash -c someFunction
无法识别该行代码之前设置的函数或变量。
如果我export -f someFunction
它会识别该函数,但someFunction
它本身只是一个分解函数,它只调用其他函数。在 chroot 环境中获取所有函数的最优雅的方法是什么?
我还需要一种将用户在脚本开头设置的所有变量导出到 chroot 环境中的方法。(我猜解决上述问题也将解决这个问题)
答案1
我设法传递变量而不复制它们(在脚本外部复制敏感变量会带来安全风险)。下面是一个片段。
cp archsin-functions /mnt/root/;
arch-chroot /mnt /bin/bash -- << EOCHROOT
source \$HOME/archsin-functions;
createSwap;
setLocale "${CITY}";
setHost "${HSTNAME}";
setInitramfs "${REPOAPITOKEN}" "${REPOID}";
setUser "${USRGROUPS}" "${USRNAME}" "${USRPASSWD}" "${REPOAPITOKEN}" "${REPOID}";
systemctl enable NetworkManager.service
EOCHROOT
shred --verbose -u --zero --iterations=3 /mnt/root/archsin-functions;
<< EOCHRROOT
-特雷多克将行标记EOCHROOT
放到/bin/bash
chroot 环境中创建的执行 shell 中。
由于变量扩展是在读取文件时完成的,因此函数将正确提供变量内保存的数据。转义符$
会阻止 的扩展,$HOME
直到该行实际执行为止。执行时,它将在 chroot 环境中完成,从而$HOME
评估/root
放置函数文件的 chroot 环境的文件夹。执行后,该文件将被删除,不留任何痕迹。
答案2
将变量和函数放在/etc/profile.d
chroot 层次结构中的目录中的文件中,然后 bash应该启动时的源(如果您已经设置了 bash 使用的其他 /etc 文件)。