Главная » 2010»Сентябрь»17 » Сохраняем видео из Flash Player 10.2 или unlink нам не помеха
15:26
Сохраняем видео из Flash Player 10.2 или unlink нам не помеха
Я, как, вероятно, и многие другие пользователи Linux, привык сохранять
видео с сайтов вроде YouTube, копируя временные файлы, создаваемые Adobe
Flash. Примерно так:
$ cp /tmp/FlashIBmQCU video.flv
Поставив свежий пре-релиз флэш-плеера, который на днях обсуждали на хабре
(у меня 64-битная система), я с удивлением обнаружил, что этот способ
больше не работает, так как никакие файлы во временном каталоге не
создаются. Рассудив, однако, что едва ли плеер хранит видео целиком в
памяти, и куда-то он его всё-таки должен писать, я приступил к
расследованию.
…То есть решил посмотреть список открытых плагином файлов. Для начала
нам нужен PID процесса, в котором хостится плагин. Пользуюсь я
Firefox-ом, так что искать будем просто:
Всё самое интересное оказалось в конце и сразу перед глазами, но для
порядка попробуем отфильтровать открытые процессом обычные (regular)
файлы. Вероятно, это можно сделать встроенными средствами lsof, но размеры man lsof
быстро отбивают желание читать его для решения такой проходной задачи.
Поэтому я предпочёл воспользоваться простым фильтром на AWK:
Сразу стало понятно, куда делся наш временный файл: плагин удалил (unlink)
ссылку на файл из каталога, но оставил открытым его дескриптор. Таким
образом файл перестал быть виден в файловой системе, но не исчез, и
окончательно удалён он будет только когда закроется последний
ссылающийся на него дескриптор.
Но как нам теперь достать содержимое файла, открытого лишь одним процессом? Очень просто, с помощью файловой системы procfs. Каталог /proc/$PID/fd содержит символьные ссылки на все открытые процессом PID дескрипторы.
(Вот, кстати, ещё один способ посмотреть открытые процессом файлы, помимо lsof).
И, хотя readlink
возвращает для некоторых из этих ссылок имена несуществующих файлов,
из них можно спокойно читать (если права позволяют), чем мы и
воспользуемся:
$ cp /proc/10099/fd/16 video.flv
Вот и всё. Это достаточно тривиальные вещи (многие, думаю, догадались, о
чём пойдёт речь с одного лишь заголовка), но, надеюсь, для кого-то
этот простой трюк окажется полезным.