Exclua o arquivo com nome de arquivo que contém caracteres não permitidos

Exclua o arquivo com nome de arquivo que contém caracteres não permitidos

Em /tmpdir eu tenho um arquivo com este nome de arquivo:

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

Não consigo remover este arquivo por meios normais e tentei citar este nome de arquivo sem resultados.

O que devo tentar a seguir?

Responder1

Use ls -lipara ver o inode e remova o inode comfind

[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:http://www.cyberciti.biz/tips/delete-remove-files-with-inode-number.html

Responder2

Experimente isto:

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

E para o futuro, quando você tiver um nome de arquivo realmente estranho, tente usar o shellglobomecanismo, por exemplo:

ls .*php*

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

ls .*php*cmd*echo*m3rg3*

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

Responder3

rmé uma fera inteligente, você pode usar glob patternsna discussão

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

*tenha cuidado ao usar rmwith glob patterns, pois isso excluirá vários arquivos que correspondem ao padrão

Responder4

findGNU ou não GNU

Com a versão GNU findvocê pode escrever diretamente, sem procurar seu inode,

find . -name '.<*' -delete

claro que é sempre recomendável tentar antes sem a -deleteopção e verificar o nome dos arquivos que você vai deletar.

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

perl

Assumindo .<*como chave que seleciona todos e apenas os arquivos que deseja excluir (não sem algunsacademiana corda)

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

Para deletar todos os arquivos ocultos do diretório bastaperl -e 'for(<'.*'>){((stat)[9]<(unlink))}'

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

Gambiarra

Em geral você pode tentar mover todos os outros arquivos para 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ê também pode usá-lo.

Ps> não esqueça rsynccom /dev/nulla -deleteopção...

informação relacionada