rsync não removendo aspas simples em torno da matriz de strings - lista de filtros

4

Tentando recuperar com segurança arquivos de máquinas com Windows XP e 2003 altamente infectadas que nos chegaram de uma aquisição. Eu tenho uma necessidade semelhante para automatizar um script que seria executado em máquinas DRBL inicializadas pelo PXE para rsync em nosso servidor.

O seguinte código resulta em aspas simples envolvendo todo o parâmetro '--filter =' '' em rsync. Nota O echo retira as aspas simples, mas não o rsync. O que estou fazendo de errado? Tornar cada parâmetro uma entrada em uma matriz ajuda?


FALHA porque envolve aspas simples :

'--filter='\''- "Default User/"'\''  --filter='\''- "Application Data/"'\'' '


Quando executo o mesmo comando, mas removo manualmente as aspas simples, o rsync é executado corretamente.
WORKS :

--filter='\''- "Default User/"'\''  --filter='\''- "Application Data/"'\'' 

Já tentei sem e sem --protect-args.


#!/bin/sh -x

PROTECTARGS=--protect-args
EXCLUDE=( '- "Default User/"' '- "Application Data/"' )
echo EXCLUDE="${EXCLUDE[*]}" 
FILTER=()
for X in "${EXCLUDE[@]}"; do
  FILTER=( "${FILTER[@]}" "--filter='${X}' " );
done;
echo FILTER="${FILTER[*]}"

if [ "1" == "1" ]; then
rsync --dry-run -vv --stats \
      --recursive \
      "$PROTECTARGS"  \
      "${FILTER[*]}"  \
      '/hddOld/Documents and Settings' \
      '/hddNew/'
fi;

OUTPUT:


FILTER=--filter='- "Default User/"'  --filter='- "Application Data/"' 
+ '[' 1 == 1 ']'
+ rsync --dry-run -vv --stats --recursive --protect-args '--filter='\''- "Default User/"'\''  --filter='\''- "Application Data/"'\'' ' '/hddOld/Documents and Settings' /hddNew/
Unknown filter rule: ''- "Default User/"'  --filter='- "Application Data/"' '
rsync error: syntax or usage error (code 1) at exclude.c(817) [client=3.0.6]




bash-4.1.2-14.el6.x86_64
rsync  version 3.0.6  protocol version 30
rsync-3.0.6-9.el6.x86_64
CentOS 6.4 x64

TRABALHA ... NÃO, NÃO:


FILTER+=( --filter=""${X}""  );

RESULTS IN:
'--filter=- "Default User/" --filter=- "Application Data/"'  

O rsync não reclama dessa regra de filtragem, mas na verdade não filtra "Application Data /".

    
por rjt 07.05.2013 / 23:22

2 respostas

1

Eu consegui fazer isso:

eu mudei:

EXCLUDE=( '- "Default User/"' '- "Application Data/"' )

para

EXCLUDE=( '-_Default User/' '-_Application Data/' )

Isso removeu as aspas duplas e usava a sintaxe de sublinhado alternativo "_" após o "-". Uma resposta anterior sugeriu isso, mas tive que adicionar a sintaxe "_" para que funcionasse para mim.

Alterado também:

FILTER=( "${FILTER[@]}" "--filter='${X}' " );

para

FILTER=( "${FILTER[@]}" "--filter=${X}" );

Isso removeu os apóstrofos da substituição da variável X.

E alterado:

"${FILTER[*]}"

para

"${FILTER[@]}"

Isso faz com que cada elemento da matriz seja tratado como um único parâmetro, em vez de toda a matriz, conforme observado anteriormente.

    
por 08.05.2013 / 05:47
1

Você tem dois problemas:

Primeiro, não use aspas em --filter (especialmente com --protect-args que diz usar isso para evitar ter que escapar de espaços, embora meus testes aqui mostrem que as aspas duplas são tomadas literalmente sem ele também). O filtro deve ser - Application Data/ . Como você escreveu com aspas, está procurando por um arquivo chamado " na pasta chamada "Application Data

O outro problema é que você quer que cada filtro seja um argumento separado para rsync , então use @ em vez de * no comando:

rsync --dry-run -vv --stats \
      --recursive \
      "$PROTECTARGS"  \
      "${FILTER[@]}"  \
      '/hddOld/Documents and Settings' \
      '/hddNew/'

Testado com:

GNU bash, version 4.1.5(1)-release (x86_64-pc-linux-gnu) e rsync version 3.0.7 protocol version 30

Eu criei uma matriz com arr=(a b "c d") , depois usei touch "${arr[@]}" para criar arquivos

a
b
c d

em dir1 .

rsync -r --filter='- c d' dir1/ dir2

copia a e b para dir2 .

rsync -r --filter='- "c d"' dir1/ dir3

copia todos os arquivos, pois o rsync está procurando por um arquivo chamado "c d" com aspas no nome do arquivo. Também testamos usando mkdir e - c d/ e - "c d/" para garantir que os filtros de diretório não funcionassem de maneira diferente e "c d/" não excluiu o diretório enquanto c d/ o excluiu.

    
por 08.05.2013 / 02:30

Tags