事件原由
把以前基于linux c写的一个纯真ip查询的server代码优化、规整了下以后,想重命名一下,而后就执行了下面两行命令:linux
1centos
2app
mvhttp.cxip.c工具
mvhttp.shxip.c优化
其实个人本意是想这样:ui
1this
2google
mvhttp.cxip.cspa
mvhttp.shxip.shunix
事件影响
.c文件是核心代码,.sh文件是编译c文件的几行gcc命令,上面mv命令误操做的结果就是彻底覆盖了.c文件,意味这两天白忙活了。
事件处理
虽然代码核心的东西都在脑子里面,从新写大半天时间也差很少能搞定了,可是仍是但愿可以有办法恢复数据,花点时间要是能找到办法,之后有更重要的数据也能用的上。
首先想到的是用ext3grep工具恢复数据,结果centos系统直接yum是找不到包的,源码包地址在http://code.google.com/p/ext3grep/上,打开结果是404页面,用个工具也真够费劲的,另外对这个工具也不是太熟悉,暂且放弃吧。
恢复过程
一、确认代码所在的目录处于磁盘的哪一个分区
1
2
3
4
5
6
7
8
9
10
11
12
[qidasheng@master~]$pwd
/home/qidasheng
[qidasheng@master~]$df-h
FilesystemSizeUsedAvailUse%Mountedon
/dev/mapper/vg_qidasheng8-lv_root50G26G21G56%/
tmpfs7.8G76K7.8G1%/dev/shm
/dev/sda1485M66M394M15%/boot
/dev/mapper/vg_qidasheng8-data0197G128G60G69%/data0
/dev/mapper/vg_qidasheng8-data1197G17G171G9%/data1
/dev/mapper/vg_qidasheng8-data2148G1.6G139G2%/data2
/dev/mapper/vg_qidasheng8-home64G20G42G32%/home
cm_processes7.8G300K7.8G1%/var/run/cloudera-scm-agent/process
经过上面的命令肯定了代码在home目录,home目录是挂在/dev/mapper/vg_qidasheng8-home 下的。
二、使用grep命令在磁盘上经过被误删代码中的比较有表明性的关键字符串查找文件所在偏移位置,返回的部份内容以下,内容前面都有一个数字串,记录这个数字串
1
2
3
4
5
6
7
8
9
10
11
[root@master~]# grep -a -b '/home/qishengfu/QQWry.Dat' /dev/mapper/vg_qidasheng8-home
2851521881:wry_file=fopen("/home/qishengfu/QQWry.Dat","r");
2851534169:wry_file=fopen("/home/qishengfu/QQWry.Dat","r");
.
[root@master~]# grep -a -b 'cJSON_AddStringToObject(fmt,"province"' /dev/mapper/vg_qidasheng8-home
1862223382:cJSON_AddStringToObject(fmt,"province",trim_str(tmp[0]));
1876743751:cJSON_AddStringToObject(fmt,"province",trim_str(tmp[0]));
[root@master~]# grep -a -b 'cJSON_AddStringToObject(fmt,"desc"' /dev/mapper/vg_qidasheng8-home
1889870235:cJSON_AddStringToObject(fmt,"desc",ip_key[1]);
三、经过dd命令利用2中获取的的偏移信息直接从磁盘读取内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@master~]# dd if=/dev/mapper/vg_qidasheng8-home count=1 skip=$(expr 1876743751 / 512)
tmp[0]=malloc(len0);
tmp[1]=malloc(len1);
strncpy(tmp[0],ip_key[0],len0);
strncpy(tmp[1],pos+len,len1);
cJSON_AddStringToObject(fmt,"province",trim_str(tmp[0]));
cJSON_AddStringToObject(fmt,"city",trim_str(tmp[1]));
}else{
cJSON_AddStringToObject(fmt,"country",ip_key[0]);
}
}
if(count>=1&&ip_key[1]!=NULL){
cJSON_AddStringToObject(fmt,"place",ip_key[1]);
}
if(count>=2&&ip_key[2]!=NULL){
注意事项:
一、 从上面数据能够看出,count=1的状况下读取的只是部分代码片断,能够把count值调大读取先后更大范围的数据;
二、第2步中获取的偏移信息不必定就是被覆盖的文件的偏移,有多是历次代码编辑中数据的偏移,因此能够把上面获取到的偏移记录位置的数据都读取出来,而后人工核对选择最接近的数据进行汇总,就能恢复获得最近的数据啦。
参数解释
grep中几个参数的解释
-a用来把二进制文件当文本文件处理,-b用来保证显示查找出的结果的偏移位置
1
2
3
4
5
-a,--text
Processabinaryfileasifitweretext;thisisequivalenttothe--binary-files=textoption.
-b,--byte-offset
Printthe0-basedbyteoffsetwithintheinputfilebeforeeachlineofoutput.If-o(--only-matching)isspecified,printtheoffsetofthe
matchingpartitself.
dd中使用的几个参数的解释
count指明读取多少个数据块,if指定读取源,skip指定跳过多少个块(后面除以512是由于,skip是跳过ibs-sized blocks,而ibs默认大小为512)
1
2
3
4
5
6
7
8
9
10
count=BLOCKS
copyonlyBLOCKSinputblocks
ibs=BYTES
readBYTESbytesatatime(default:512)
if=FILE
readfromFILEinsteadofstdin
skip=BLOCKS
skipBLOCKSibs-sizedblocksatstartofinput
失而复得的心情比天上掉馅饼还好!