
En /tmp
el directorio tengo un archivo con este nombre de archivo:
.<?php passthru($_GET['cmd']);echo 'm3rg3';?>
No puedo eliminar este archivo por medios normales y he intentado citar este nombre de archivo sin resultados.
¿Qué debo probar a continuación?
Respuesta1
Úselo ls -li
para ver el inodo y retire el inodo confind
[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
Referencia:http://www.cyberciti.biz/tips/delete-remove-files-with-inode-number.html
Respuesta2
Prueba esto:
rm -iv -- .\<\?php\ passthru\(\$_GET\[cmd\]\)\;echo\ m3rg3\;\?\>
Y en el futuro, cuando tenga un nombre de archivo realmente extraño, intente utilizar el shell.globomecanismo, por ejemplo:
ls .*php*
debería ser un buen comienzo. Si tiene muchos archivos con nombres similares, simplemente use cualquier subcadena regular única
ls .*php*cmd*echo*m3rg3*
Y al final puede presionar Tabpara completar el nombre del archivo si el shell que está utilizando tiene un mecanismo de finalización.
Respuesta3
rm
es una bestia inteligente, puedes usarla glob patterns
en el argumento
Para tu caso un simple rm .\<*
es suficiente
*tenga cuidado al utilizar rm
with glob patterns
ya que eliminará varios archivos que coincidan con el patrón
Respuesta4
find
GNU o no GNU
Con la versión GNU de find
puedes escribir directamente, sin buscar su inodo,
find . -name '.<*' -delete
Por supuesto, siempre se sugiere probar antes sin la -delete
opción y verificar el nombre de los archivos que vas a eliminar.
Con una versión que no sea GNU también se podría hacer directamente find . -name '.<*' -exec rm -i {} \;
y funciona también con la versión GNU, sólo que unas 3 veces más lento [1] luego con -delete
.
Cuando no haya demasiados archivos, también podrás usarlos find . -name '.<*' -exec rm -i {} +
, nuevamente más rápido.
perl
Asumiendo .<*
como clave que selecciona todos y solo los archivos que desea eliminar (no sin algunosgimnasiaen la cuerda)
perl -e 'for(<'.'\<'*'>){((stat)[9]<(unlink))}'
Para eliminar todos los archivos ocultos del directorio es suficienteperl -e 'for(<'.*'>){((stat)[9]<(unlink))}'
Es más rápido con muchos archivos. Compruebe la expresión porque normalmente no trabajo con Perl.
Solución alterna
En general, puede intentar mover todos los demás archivos en otro directorio y eliminar el directorio original.
mv /tmp /tmp2; mkdir tmp; mv /tmp2/* /tmp; rm tmp2
Inconvenientes si algún archivo está en uso... pero hay casos en los que también puedes usarlo.
Ps> no olvides rsync
hacer /dev/null
con la -delete
opción...