스크립트의 매개변수에 값 전달

스크립트의 매개변수에 값 전달

다음은 chroot 환경을 생성하는 명령에 대한 모든 라이브러리를 복사하는 스크립트입니다.

예를 들어:

./cplb.sh /bin/ls명령의 모든 라이브러리 ls(즉, ldd /bin/ls명령에 의해 나열된 파일)가 복사됩니다.

cplb.sh

CHROOT='/var/chroot'
mkdir $CHROOT

for i in $( ldd $* |cut -d " " -f3 |sort |uniq)
do
cp --parents $i $CHROOT
done

echo "Chroot jail is ready. To access it execute: chroot $CHROOT"

이제 실행하면 ./cplb.sh /bin/ls매력처럼 작동합니다. 하지만 다음과 같이 여러 명령을 동시에 실행할 때:

./cplb.sh /bin/{ls,cat}

다음과 같은 오류가 발생합니다.

cannot stat : '/bin/ls:' file or dir not found
cannot stat : '/bin/cat:' file or dir not found

명령 뒤에 콜론이 표시됩니다. 즉, /bin/ls:이 콜론이 오류의 원인입니다. 이제 이 문제는 어디서 왔으며 동시에 여러 명령을 사용하여 스크립트를 실행할 수 있도록 이 문제를 어떻게 해결할 수 있습니까?

답변1

출력은 ldd /bin/ls다음과 같습니다.

linux-vdso.so.1 (0x00007fff2cffe000)
libcap.so.2 => /usr/lib/libcap.so.2 (0x00007f87e978f000)
libacl.so.1 => /usr/lib/libacl.so.1 (0x00007f87e9586000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007f87e91d9000)
libattr.so.1 => /usr/lib/libattr.so.1 (0x00007f87e8fd4000)
/lib64/ld-linux-x86-64.so.2 (0x00007f87e9993000)

출력은 ldd /bin/ls /bin/cat다음과 같습니다.

/bin/ls:
    linux-vdso.so.1 (0x00007fffd25df000)
    libcap.so.2 => /usr/lib/libcap.so.2 (0x00007f28f8d09000)
    libacl.so.1 => /usr/lib/libacl.so.1 (0x00007f28f8b00000)
    libc.so.6 => /usr/lib/libc.so.6 (0x00007f28f8753000)
    libattr.so.1 => /usr/lib/libattr.so.1 (0x00007f28f854e000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f28f8f0d000)
/bin/cat:
    linux-vdso.so.1 (0x00007ffff9dfe000)
    libc.so.6 => /usr/lib/libc.so.6 (0x00007fc44208a000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fc442437000)

이 시도:

ldd "$@" | cut -d' ' -f3 | sort -u | grep -v ':$' |
while read i
do
    cp --parents "$i" "$CHROOT"
done

위에서는 합계 라인을 grep삭제 하는 데 사용했습니다 . 예 후행 콜론과 일치하는 정규식입니다./bin/ls:/bin/cat::$

귀하의 스크립트에 몇 가지 다른 변경 사항을 적용했습니다. 파이프-루프(pipe-to-loop) 스타일이 더 관용적입니다. 일반적으로 중복 항목을 제거하는 옵션이 sort있습니다 . 일반적 으로 공백과 특수 문자가 포함된 파일 이름으로 올바르게 확장되므로 대신 -u사용하는 것이 더 좋습니다 . 하지만 이 경우에는 그런 것이 중요하지 않습니다."$@"$*


명령과 해당 라이브러리를 복제하려면 cp루프 아래에 두 번째 호출을 추가하십시오.

ldd "$@" | cut -d' ' -f3 | sort -u | grep -v ':$' |
while read i
do
    cp --parents "$i" "$CHROOT"
done
cp --parents "$@" "$CHROOT"

관련 정보