Recuperando un archivo eliminado pero abierto por otro proceso

Hoy, hace escasos 10 minutos estaba limpiando el disco, así que me dirijí a la carpeta de vídeos y... ¡raaaaca!, 20 archivos a alimentar la bestia del espacio libre. Pero al ver los archivos que habían sobrevivído a la limpieza sobrevino la preocupación sobre el paradero de uno de ellos, y es que quizá al fin y al cabo saltarse el paso de la papelera de reciclaje no fuera buena idea.

El problema era que me había cargado una película que tenía pensado compartir y con más bien pocos seeders, así que tocaba recuperarlo. Por suerte el transmission seguía abierto y seedeando, así que aún había esperanza, al fin y al cabo aún contaría con la información del archivo.

Los pasos a seguir fueron localizar primero el proceso

$ ps aux|grep transmission
1000      8546  0.0  0.0  12956   920 pts/5    S+   16:33   0:00 grep --color=auto transmission
1000     26127  5.6  2.3 402320 23784 ?        Ssl  11:54  15:40 transmission-gtk

Proceso 26127, lo siguiente sería saltar al lugar donde se guarda la información describiendo los archivos abiertos, este es /proc//fd/, es decir

$ cd /proc/26127/
$ ls fd/
0   11  14  17  2   22  25  28  30  33  36  39  41  44  47  5   52  55  8
1   12  15  18  20  23  26  29  31  34  37  4   42  45  48  50  53  6   9
10  13  16  19  21  24  27  3   32  35  38  40  43  46  49  51  54  7   96

A continuación toca buscar el que nos interesa, no podemos llevarnos todos (o sí, pero no es necesario :P)

$ file fd/*
fd/0:  symbolic link to `/dev/null`
fd/1:  symbolic link to `/home/kenkeiras/.xsession-errors`
fd/10: broken symbolic link to `socket:[745308]`
fd/11: broken symbolic link to `anon_inode:[eventfd]`
[...]
fd/7:  broken symbolic link to `pipe:[745550]`
fd/8:  broken symbolic link to `anon_inode:[eventpoll]`
fd/9:  broken symbolic link to `socket:[745307]`
fd/96: broken symbolic link to `/home/kenkeiras/Vídeos/La.Estrategia.del.caracol.avi (deleted)`

El que nos interesa en este caso es entonces el último, hacemos caso omiso al '(deleted)' y guardaremos todo lo que contenga, en este caso al archivo 'save' (¡cuidado!, si ya existe un archivo con este nombre lo sobreescribirá).

$ cat fd/96 > ~/Vídeos/save

Cuando acabe y lo hayamos probado ya podemos renombrarlo

[~/Vídeos]$ mv save La.Estrategia.del.caracol.avi

Y ya está, como si no hubiera pasado nada.

...Aquí queda como apunte por si alguien se encuentra alguna vez en la misma situación ;)

Esquivando nuestro antidebuggers simple a golpe de LD_PRELOAD » « Sobre el `branching prediction` en x86