작업 디렉터리의 chroot를 지정합니다.

작업 디렉터리의 chroot를 지정합니다.

chroot작업 디렉터리를 설정할 수 있는 명령에 대한 래퍼를 작성 하고 싶다고 가정해 보겠습니다 . 그렇지 않으면 chroot의미 체계가 유지됩니다. 따라서 의미는 다음과 같아야 합니다.

chroot.sh <chroot-dir> <working-dir> <command> [arg]...

내 순진한 시도는 다음과 같습니다

#!/bin/sh

chroot_dir=$1
working_dir=$2

shift 2

chroot "$chroot_dir" sh -c "cd $working_dir; $*"

그러나 이것은 올바르게 처리되지 않습니다.

chroot.sh /path/to/chroot /tmp touch 'filename with space'

올바르게 구현하는 방법을 모르겠습니다. bash 만 사용할 수 있습니까?

내 CentOS 6 시스템에서는 chroot명령이 작업 디렉터리 설정을 지원하지 않습니다. 다른 시스템에서는 그렇지 않을 수도 있습니다.

답변1

이를 처리하는 방법은 매개변수를 참조 목록으로 전달하는 것입니다.뒤쪽에다음을 통해 호출되는 명령 chroot:

chroot "$chroot_dir" sh -c 'cd "$1" && shift && "$@"' - "$working_dir" "$@"

다음은 일반 환경 설정을 포함한 실제 예제입니다 chroot.

설정

# Where
chroot="$HOME/chroot"

# Directory structure
mkdir -p -m755 "$chroot"/{bin,dev,lib,tmp}
chmod 1777 "$chroot"/tmp

# Shell
cp -a /bin/dash "$chroot"/bin/sh

# Devices
cp -a /dev/{null,tty} "$chroot"/dev

# Libraries
cp -p $(ldd /bin/dash | sed 's/^.*=> //' | awk '!/vdso/ {print $1}' ) "$chroot"/lib/

# Demonstration executable
cat >"$chroot"/bin/args <<'EOF'
#!/bin/sh
#
echo "Got $# arg(s): $*"
echo "CWD: $(pwd)"
printf '> %s <\n' "$@"
EOF
chmod a+x "$chroot"/bin/args

실행(응용 프로그램 args)

working_dir=/tmp
chroot "$chroot" /bin/sh -c 'cd "$1" && shift && "$@"' - "$working_dir" args 'one two' three

산출

Got 2 arg(s): one two three
CWD: /tmp
> one two <
> three <

출력에서 볼 수 있듯이 공백과 매개변수는 올바르게 유지됩니다.

답변2

마침내 나는 다음과 같은 해결책을 생각해 냈습니다.

#!/bin/sh

chroot_dir=$1
working_dir=$2

shift 2

printf -v CMDS " %q" "$@"

chroot "$chroot_dir" sh -c "cd \"$working_dir\";$CMDS"

답변3

이것은 당신이 원하는 일을하는 것 같습니다 :

#!/bin/bash

chroot_dir="$1"
shift

working_dir="$1"
shift

cmd="$@"

chroot "${chroot_dir}" sh -c "cd ${working_dir} ; ${cmd}"

/tmp는 스크립트로만 시작됩니다.

# ls /tmp
chroot.sh

/mnt/foo바인드 마운트가 있는 chroot가 있습니다 /.

# /tmp/chroot.sh /mnt/foo /tmp touch '"filename with spaces"'

이제 파일이 filename with spaces존재하는지 확인하세요.

# ls -1 /tmp
chroot.sh
'filename with spaces'

관련 정보