Shell-Script

如何使用 chroot 解釋 shell-session 環境變數、上下文

  • April 20, 2017

所以我正在編寫一個腳本,讓我們呼叫它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 會話。我感到困惑的原因是無論如何都忽略$HOMEroot/root 一點。(捂臉)因此,無論我聲明什麼,當我 chroot 回來時,我都會輸掉。

我在這裡看到兩個潛在的選擇:

  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腳本就可以發揮它的魔力,而且我不必擔心重新設置環境更改或添加到文件?(我輸入時所做的每個文件,設置調整,我必須在保存文件系統之前考慮並添加到清理腳本中。)

我覺得您的後續問題源於您最初的問題(但我無法分辨,不容易閱讀構想)

相關部分是這樣的:

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;

您尚未澄清,但我認為這代表了您的會話建構器腳本的內容?

如果是這樣,那麼是的,export VARNAME=value僅適用於它執行的 shell 會話或腳本,而不是呼叫它的會話。

export關鍵字允許子程序繼承該變數,否則它會嚴格停留在正在執行的會話/shell 腳本的範圍內。環境變數永遠不會向上冒泡到呼叫者的環境。這將是一個災難性的運營問題,更不用說安全雷區了。

至於將變數定義放在哪裡:

所有使用者都可以擁有一個~/.bashrc~/.profile文件,甚至rootroot確實是一個使用者,它只是在別處擁有特權和一個主文件夾。

但是,您的 bash 會話從HOME目前設置的任何內容開始。呼叫chroot時需要提供預期目標HOME

  1. 添加export PATH=$PATH:/root/bin$mountpoint/root/.bashrc
  • 也許還可以添加echo Welcome to the chroot environment相同.bashrc的內容以查看它是否有效
  1. 呼叫 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

您其餘問題的答案應該從那裡流出?

引用自:https://unix.stackexchange.com/questions/360135