Exclui o arquivo com o nome do arquivo que contém caracteres não permitidos

3

Em /tmp dir, tenho um arquivo com este nome de arquivo:

.<?php passthru($_GET['cmd']);echo 'm3rg3';?>

Eu não posso remover este arquivo por meios normais e tentei citar este nome de arquivo sem resultados.

O que devo tentar em seguida?

    
por Miloš Đakonović 23.06.2016 / 17:56

4 respostas

6

Use ls -li para ver o inodo removendo o inode com find

[root@server tmp]# ls -li .\<*
16163346 -rw-r--r-- 1 root root 0 Jun 23 12:02 .<?php  passthru($_GET[cmd]);echo 
[root@server tmp]# find . -inum 16163346 -exec rm -i {} \;
rm: remove regular empty file './.<?php passthru($_GET[cmd]);echo'? y

Referência: link

    
por 23.06.2016 / 18:04
6

Tente isto:

rm -iv -- .\<\?php\ passthru\(\$_GET\[cmd\]\)\;echo\ m3rg3\;\?\>

E para o futuro, quando você tiver um nome de arquivo muito estranho, tente usar o mecanismo shell glob , por exemplo:

ls .*php*

deve ser um bom começo. Se você tiver muitos arquivos com nomes de arquivos semelhantes, basta usar qualquer substring regular exclusiva

ls .*php*cmd*echo*m3rg3*

E no final você pode clicar em Tab para completar o nome do arquivo se o shell que você está usando tiver um mecanismo de conclusão.

    
por 23.06.2016 / 18:11
1

rm é uma fera inteligente, você pode usar glob patterns no argumento

Para o seu caso, um simples rm .\<* é suficiente

* tenha cuidado ao usar rm com glob patterns , pois ele excluirá vários arquivos correspondentes ao padrão

    
por 24.06.2016 / 01:04
0

find GNU ou não GNU

Com a versão GNU de find você pode escrever diretamente, sem procurar por seu inode,

find . -name '.<*' -delete

é claro que é sempre sugerido tentar antes sem a opção -delete e verificar o nome dos arquivos que você irá excluir.

Com uma versão não GNU também pode ser feito diretamente find . -name '.<*' -exec rm -i {} \; , que também funciona com a versão GNU, apenas cerca de 3 vezes mais lenta [ 1 ] , em seguida, com -delete .
Quando não há muitos arquivos, você pode usar find . -name '.<*' -exec rm -i {} + , novamente mais rápido.

perl

Assumindo .<* como chave que seleciona todos e somente os arquivos que você deseja excluir (não sem algum ginásio na string)

perl -e 'for(<'.'\<'*'>){((stat)[9]<(unlink))}'

Para apagar todos os arquivos ocultos do diretório, é suficiente perl -e 'for(<'.*'>){((stat)[9]<(unlink))}'

É mais rápido com muitos arquivos. Verifique a expressão porque não trabalho normalmente com perl.

Solução alternativa

Em geral, você pode tentar mover todos os outros arquivos em outro diretório e excluir o diretório original

mv /tmp /tmp2; mkdir tmp; mv /tmp2/* /tmp; rm tmp2

Desvantagens se algum arquivo estiver em uso ... mas há casos em que você pode usá-lo também.

Ps > não se esqueça de rsync to /dev/null com a opção -delete ...

    
por 24.06.2016 / 12:04