chrootを使用してシェルセッション環境変数、コンテキストを解釈する方法

chrootを使用してシェルセッション環境変数、コンテキストを解釈する方法

chroot-session-builderだから私は別のオペレーティングシステムでファイルシステムをマウントし、別のファイルシステムのルートを指定したシェルにログインするスクリプトを書いています。うまくいきますが、私は愚かでうまくいきたいです。

関連部分はこんな感じです。

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元の次の呼び出しのコンテキストで実行されているシェルに返されます。

chroot $mount_point

私のchroot環境に連れて行ってください。

いくつかのテストを実行し、これを発見するまで、今は明らかではありませんでした。PATHにパスを正しく追加するには?export、ステートメントが変数を現在のシェルセッションに公開することがあります。私が混乱した理由は$HOMEこれを見落としたからです。root/root それでも。 (Facepalm) したがって、再度ログインすると、私が宣言したすべての内容が失われます。

これには2つの潜在的なオプションがあります。

echo "export PATH:$PATH/root/bin" >>1)以下の場合にcanを書くことができます/root/.profile

source /root/.profile新しいシェルはロード時に/root/.profileから読み取られるため、chrootコンテキストを再入力した後に手動で実行する必要はありません。

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呼び出されるセッションではなく実行されるシェルセッションまたはスクリプトにのみ適用されます。

このexportキーワードを使用すると、子プロセスが変数を継承できます。それ以外の場合は、実行中のセッション/シェルスクリプトの範囲内で厳密に保持されます。環境変数は、呼び出し側の環境までバブリングされません。これは安全地雷原だけでなく、致命的な運営上の問題になります。

変数定義の配置について:

すべてのユーザーがファイル~/.bashrc~/.profile所有できます。実際にユーザーであっても、ホームフォルダの他の場所に特別な権限があるだけですrootroot

ただし、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

残りの質問への答えはどこから出るべきですか?

おすすめ記事