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
所有できます。実際にユーザーであっても、ホームフォルダの他の場所に特別な権限があるだけです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
残りの質問への答えはどこから出るべきですか?