私は、おそらく他の多くのLinuxユーザーと同様に、Adobe Flashによって作成された一時ファイルをコピーして、YouTubeなどのサイトからビデオを保存することに慣れています。 このようなもの:
$ cp /tmp/FlashIBmQCU video.flv
最近
、ハブで
議論されたフラッシュプレーヤーの新しいプレリリース(64ビットシステムを使用しています)を置いた後、一時ディレクトリにファイルが作成されないため、この方法が機能しなくなったことに驚きました。 ただし、プレーヤーがビデオ全体をメモリに保存することはほとんどなく、どこかでそれを書き込む必要があると判断したため、調査を開始しました。
...つまり、プラグインによって開かれたファイルのリストを表示することにしました。 まず、プラグインがホストされているプロセスのPIDが必要です。 私はFirefoxを使用しているため、単に検索します。
$ ps x | grep firefox
9800? S 0:00 / bin / sh /usr/lib/firefox-3.6.9/firefox
9805? S 0:00 / bin / sh /usr/lib/firefox-3.6.9/run-mozilla.sh /usr/lib/firefox-3.6.9/firefox-bin
9809 Sl 14:58 /usr/lib/firefox-3.6.9/firefox-bin
10099? Sl 4:10 /usr/lib/firefox-3.6.9/plugin-container /usr/lib/mozilla/plugins/libflashplayer.so 9809プラグイン
26199ポイント/ 13 S + 0:00 grep firefox
ご覧のとおり、Mozillaはプラグインを別のプロセスで実行し、そのPIDは10099です。現在、
lsof
コマンドで開いているファイルのリストを確認できます。
$ lsof -p 10099
コマンドPIDユーザーFDタイプデバイスサイズノード名
#152行スクランブル
plugin-co 10099 rooslan mem REG 8.21 26048 2656 /usr/lib/gconv/gconv-modules.cache
plugin-co 10099 rooslan mem REG 8.21 343 106080 /usr/lib/locale/ru_RU.utf8/LC_IDENTIFICATION
plugin-co 10099 rooslan 0r CHR 1.3 3419 / dev / null
plugin-co 10099 rooslan 1w FIFO 0.6 9649パイプ
plugin-co 10099 rooslan 2w FIFO 0.6 9649パイプ
plugin-co 10099 rooslan 3u unix 0xffff88007304a3c0 287192ソケット
plugin-co 10099 rooslan 4r 0000 0.7 0 32 anon_inode
plugin-co 10099 rooslan 5w unix 0xffff8800c5425e40 287277ソケット
plugin-co 10099 rooslan 6r unix 0xffff8800c5424b00 287278ソケット
plugin-co 10099 rooslan 7w FIFO 0.6 287279パイプ
plugin-co 10099 rooslan 8r FIFO 0.6 287279パイプ
plugin-co 10099 rooslan 9w FIFO 0.6 287280パイプ
plugin-co 10099 rooslan 10u FIFO 0.6 287280パイプ
plugin-co 10099 rooslan 11u FIFO 0.6 287281パイプ
plugin-co 10099 rooslan 12u FIFO 0.6 287281パイプ
plugin-co 10099 rooslan 13u UNIX 0xffff88007304a100 287284ソケット
plugin-co 10099 rooslan 14u REG 8.24 376832 1409239 /home/rooslan/.mozilla/firefox/xxxxxxxx.default/cert8.db
plugin-co 10099 rooslan 15w REG 8.24 16384 1409240 /home/rooslan/.mozilla/firefox/xxxxxxxx.default/key3.db
plugin-co 10099 rooslan 16u REG 8.23 494641 16 / tmp / FlashXXlm7mcU(削除済み)
plugin-co 10099 rooslan 17u FIFO 0.6 404625パイプ
plugin-co 10099 rooslan 18u FIFO 0.6 404625パイプ
plugin-co 10099 rooslan 19r FIFO 0.6 404626パイプ
plugin-co 10099 rooslan 20w FIFO 0.6 404626パイプ
plugin-co 10099 rooslan 21r UNIX 0xffff880015a2b9c0 404630ソケット
最も興味深いものはすべて私の目の前と最後にあることが判明しましたが、順序のために、プロセスによって開かれた通常のファイルを除外してみましょう。 おそらく、組み込みの
lsof
ツールを使用してこれを行うことができますが、
man lsof
の大きさにより、このような通過する問題を解決するためにそれを読むことはすぐに
man lsof
。 したがって、AWKで単純なフィルターを使用することを好みました。
$ lsof -p 10099 | awk '$ 4〜/ ^ [0-9] + / && $ 5 == "REG"'
plugin-co 10099 rooslan 14u REG 8.24 376832 1409239 /home/rooslan/.mozilla/firefox/xxxxxxxx.default/cert8.db
plugin-co 10099 rooslan 15w REG 8.24 16384 1409240 /home/rooslan/.mozilla/firefox/xxxxxxxx.default/key3.db
plugin-co 10099 rooslan 16u REG 8.23 494641 16 / tmp / FlashXXlm7mcU(削除済み)
一時ファイルの場所がすぐに明らかになりました。プラグインはディレクトリからファイルへのリンクを削除(
unlink )しましたが、その記述子は開いたままにしました。 したがって、ファイルはファイルシステムに表示されなくなりましたが、消えることはなく、それを参照する最後のハンドルが閉じられたときにのみ永久に削除されます。
しかし、1つのプロセスだけでファイルの内容を開くにはどうすればよいでしょうか?
procfsファイルシステムを使用すると非常に簡単です。
/proc/$PID/fd
ディレクトリには、
PIDプロセスによって開かれたすべての記述子へのシンボリックリンクが含まれています。
$ ls -l / proc / 10099 / fd
合計0
lr-x ------ 1 rooslan rooslan 64 2010-09-16 23:56 0-> / dev / null
l-wx ------ 1 rooslan rooslan 64 2010-09-16 23:56 1->パイプ:[9649]
lrwx ------ 1 rooslan rooslan 64 2010-09-16 23:56 10->パイプ:[287280]
lrwx ------ 1 rooslan rooslan 64 2010-09-16 23:56 11->パイプ:[287281]
lrwx ------ 1 rooslan rooslan 64 2010-09-16 23:56 12->パイプ:[287281]
lrwx ------ 1 rooslan rooslan 64 2010-09-16 23:56 13->ソケット:[287284]
lrwx ------ 1 rooslan rooslan 64 2010-09-16 23:56 14-> /home/rooslan/.mozilla/firefox/xxxxxxxx.default/cert8.db
l-wx ------ 1 rooslan rooslan 64 2010-09-16 23:56 15-> /home/rooslan/.mozilla/firefox/xxxxxxxx.default/key3.db
lrwx ------ 1 rooslan rooslan 64 2010-09-16 23:56 16-> / tmp / FlashXXpOdDuF(削除済み)
lrwx ------ 1 rooslan rooslan 64 2010-09-16 23:56 17->パイプ:[396658]
lrwx ------ 1 rooslan rooslan 64 2010-09-16 23:56 18->パイプ:[396658]
lr-x ------ 1 rooslan rooslan 64 2010-09-16 23:56 19->パイプ:[396659]
l-wx ------ 1 rooslan rooslan 64 2010-09-16 23:56 2->パイプ:[9649]
l-wx ------ 1 rooslan rooslan 64 2010-09-16 23:56 20->パイプ:[396659]
lr-x ------ 1 rooslan rooslan 64 2010-09-16 23:56 21->ソケット:[396663]
lrwx ------ 1 rooslan rooslan 64 2010-09-16 23:56 3->ソケット:[287192]
lr-x ------ 1 rooslan rooslan 64 2010-09-16 23:56 4-> anon_inode:[イベントポール]
l-wx ------ 1 rooslan rooslan 64 2010-09-16 23:56 5->ソケット:[287277]
lr-x ------ 1 rooslan rooslan 64 2010-09-16 23:56 6->ソケット:[287278]
l-wx ------ 1 rooslan rooslan 64 2010-09-16 23:56 7->パイプ:[287279]
lr-x ------ 1 rooslan rooslan 64 2010-09-16 23:56 8->パイプ:[287279]
l-wx ------ 1 rooslan rooslan 64 2010-09-16 23:56 9->パイプ:[287280]
(ちなみに、ここで、プロセスによって開かれたファイルを表示する別の方法は、
lsof
以外です)。
そして、
readlinkはこれらのリンクのいくつかについて存在しないファイルの名前を返しますが、それらから安全に読み取ることができます(許可が許可されている場合)。
$ cp / proc / 10099 / fd / 16 video.flv
以上です。 これらは非常に些細なことです(多くの人が、単独で見出しから議論されることを推測していると思います)が、誰かにとって、この簡単なトリックが役に立つことを願っています。
UPD
kreonはこれらのアクションをスクリプトとして設計しました(引数を追加することで少し変更することができました)。
#!/ bin / sh
PID = `ps x | grep libflashplayer.so | grep -v grep | awk '{print $ 1}' '
FD = `lsof -p $ PID | grepフラッシュ| awk '{print $ 4}' | sed 's / u ^ //' '
cp / proc / $ PID / fd / $ FD "$ 1"
使用法:
$ saveflash.sh coolvideo.flv
UPD 2
コメントの中で、彼らはこの方法の不合理性を繰り返し指摘し、代わりにビデオをダウンロードするためのさまざまなブラウザプログラムとプラグインを提供しました。 もちろん、YouTubeからダウンロードするには、これらを使用する方が便利です(ただし、上記のブラウザのキャッシュからビデオを取得する機能のために壊れているかどうかを確認する必要があります)。 ただし、これらのプラグインはすべて、ビデオホスティングサイトの特定のリストではなく、かなり大きなリストを対象としています。 この方法では、ビデオがHTTP経由でダウンロードされ、RTMPストリーミングが使用されていない場合でも、ほとんど常にビデオを取得できます。