Em /tmp
dir 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 -li
para 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 patterns
na discussão
Para o seu caso um simples rm .\<*
é suficiente
*tenha cuidado ao usar rm
with glob patterns
, pois isso excluirá vários arquivos que correspondem ao padrão
Responder4
find
GNU ou não GNU
Com a versão GNU find
você pode escrever diretamente, sem procurar seu inode,
find . -name '.<*' -delete
claro que é sempre recomendável tentar antes sem a -delete
opçã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 rsync
com /dev/null
a -delete
opção...