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) 따라서 다시 로그인하면 내가 선언한 모든 내용이 손실됩니다.

여기에는 두 가지 잠재적인 옵션이 있습니다.

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을 제공해야 합니다.

  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

나머지 질문에 대한 답변은 어디에서 나와야 합니까?

관련 정보