Adobe邪恶了…

以前在Linux下提取Flash视频很容易, 只要去/tmp下找Flash开头的文件保存就好, 但是最近几个版本的Flash插件却找不到这些缓存文件了.

研究了一下, 发现这些文件其实还是在/tmp下, 但是文件建立打开之后inode却被删掉了, 所以不可见, 确实有点邪恶吧? 但是既然文件是打开的状态, lsof就肯定能看到, /proc中就肯定有它的文件描述符, 剩下的事情比较容易, 脚本如下:

#!/bin/sh

DESTDIR="${HOME}/Videos/Flash"

if [ ! -d "$DESTDIR" ]
then
	mkdir -p $DESTDIR || exit 1
fi

LINES=`lsof |grep '/tmp/Flash[^ ]*'`

IFS=$'\n'

for i in $LINES
do
	FILE=`echo $i |awk '{print "/proc/" $2 "/fd/" $4}' |sed 's/[rwu]$//'`
	NAME=`echo $i |awk '{print $9}' |awk -F '/' '{print $3}'`

	cp $FILE ${DESTDIR}/${NAME}.flv
done

exit 0

这里面的目标存放文件夹我指定的是~/Videos/Flash, 如果想放到别的地方, 改DESTDIR这个变量就好.

另外, 这个脚本很简单, 但是写的过程中我也学到了一个小技巧, 就是IFS(Internal Field Separator)这个变量, 这个变量告诉了shell在处理字符串时如何判断一个词, 默认值是空格, Tab和换行, 我把它给设置成了只有换行, 因为我想在后面的for循环中每次处理一行而不是一个词.