Passando valores para um parâmetro no script

2

A seguir, o script para copiar todas as bibliotecas de um determinado comando para criar meu ambiente chroot.

Por exemplo:

./cplb.sh /bin/ls copiará todas as bibliotecas do comando ls (ou seja, os arquivos listados pelo comando 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"

Agora, quando executo ./cplb.sh /bin/ls , funciona como um encanto. Mas quando eu executo isso para vários comandos ao mesmo tempo, por exemplo:

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

gera um erro dizendo:

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

Eu posso ver dois pontos após o comando, ou seja, /bin/ls: e esse cólon causa o erro. Agora, de onde vem e como resolver isso, para que eu possa executar o script para vários comandos ao mesmo tempo?

    
por Being Gokul 21.07.2013 / 21:51

1 resposta

1

Esta é a aparência da saída de 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)

Esta é a aparência da saída de 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)

Tente isso:

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

Acima, usamos grep para remover as linhas /bin/ls: e /bin/cat: . O código% é uma expressão regular que corresponde a dois pontos nas extremidades das linhas.

Note que fiz algumas outras alterações no seu script. O estilo piping-loop é um pouco mais idiomático. :$ geralmente tem uma opção sort para remover duplicatas. Geralmente, é preferível usar -u em vez de "$@" , pois isso se expandirá para nomes de arquivos com espaços e caracteres especiais corretamente. Não deveria importar em neste caso, no entanto.

Para copiar os comandos e suas bibliotecas, adicione uma segunda chamada a $* abaixo o loop.

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