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'