Linux下的误删大坑与简单的恢复技巧
By 苏剑林 | 2017-07-16 | 28533位读者 |警告 #
以下内容包含诸多高危动作,请勿随意模仿。未成年人请在父母的陪同下观看~(^_^)
自杀式 #
Linux系统(下面内容同时适用于Mac OS)以开源自由闻名,然而有些时候它也开放过头了,而笔者也被它无比开发的特性坑了好几次(当然,主要是笔者使用习惯不好),遂总结分享,供大家娱乐。
最经典的例子就是,通过以下命令就可以实现“自杀”:
sudo rm / -rf
这就把你的Linux系统给毁了。显然,如果是在Windows中,这相当于在操作系统中格式化系统盘,这是绝对不允许的。
类似的命令是mv,比如以下命令,虽然没有rm那么严重,但也差不多能把你系统毁了:
sudo mv /* /root
这样的高危命令还有不少,比如dd,在Linux或Mac OS中,用dd烧写镜像是很常见的,但千万要看准目标盘符,不然可能让你悔到肠子都青了,比如
sudo dd bs=4m if=xxx.img of=/dev/rdisk0
接着你的系统就挂了~这是笔者的亲身经历!!烧录树莓派,把自己的MacBook的系统烧没了,花了N久才通过网络重装好。
误杀式 #
当然,尽管sudo rm / -rf这样的命令很危险,但我们也不傻,所以也不会直接运行它们。所以它们基本上都是仅供娱乐观赏的,并不会有什么危险的后果。更严重的后果往往是意外造成的,而且是意想不到的意外(尤其是新手)。
比如,下面的命令是很常见的:
sudo mv a/* b
意图很简单,就是把当前路径的a目录里边的所有东西移动到当前路径下的b目录,看上去挺安全的,不影响系统本身呀。然而,如果手贱多打了一个空格呢?
sudo mv a /* b
不好意思,只能呵呵了~你只能寄望于你及时反应过来并按下了ctrl+c,否则有你折腾的了,这同样会把你的系统文件全部移动到b目录,接着导致几乎所有命令都运行不了(包括mv)。这也是笔者前不久跳进了的一个坑,为此又浪费了好多时间~对了,rm命令也有同样的风险。
恢复式 #
说完了悲伤的故事,就来说说一点让人欣慰的东西~
如果误删了系统文件,尤其是毁灭性的误删,那么笔者也爱莫能助了。不过,如果只是误删掉文本文件,比如误删了刚写好没多久又忘记备份的代码脚本(尤其是删掉了你殚精竭虑写出来的很长的代码,足以让你想死的心都有了),还是有可能恢复的,而且恢复起来不算特别复杂。
先来创建一个文件
echo '物理宇宙学是天体物理学的分支,它是研究宇宙大尺度结构和宇宙形成及演化等基本问题的学科。宇宙学的研究对象是天体运动和它的第一起因,在人类历史的很长一段时期曾是形而上学的一部分。作为科学,宇宙学起源于哥白尼原则和牛顿力学,它们指出天体和地球上的物体遵守同样的物理原理并解释了天体的运动。现在这一分支被称为天体力学。一般认为,物理宇宙学起源于二十世纪的爱因斯坦广义相对论和对极远天体的天文观测。' > test.txt
然后rm test.txt删掉它,接着执行
sudo grep -a -B 5 -A 10 '宇宙学的研究对象是天体运动和它的第一起因' /dev/sda5 > results.txt
参数解释:
1、grep是基于正则表达式的文本搜索;
2、-a的意思为–binary-files=text,把二进制文件当作文本文件;
3、-B和-A的选项就是这段字符串之前几行和之后几行;
4、'宇宙学的研究对象是天体运动和它的第一起因',是原来文本文件的一些内容;
5、/dev/sda5,就是硬盘设备,可以通过df命令查看;
6、> results.txt,就是把结果输出到results.txt文件中。
这句命令比较耗时,甚至可能报内存不足的错误。不管怎样,命令运行完之后,我们可以在results.txt中,寻找我们需要的内容,如果幸运的话,被删除的内容就在results.txt中。如果你多次修改过test.txt,那么原有的文本片段可能多次重复出现在results.txt中。为了定位到文本内容,可以利用编程工具读取results.txt后再查找(因为如果你提供的文本片段太泛,那么results.txt可能很大,一般的文本编辑器几乎操作不了),比如,我用Python。
s = open('results.txt').read()
'宇宙学的研究对象是天体运动和它的第一起因' in s #显示为True,有戏^_^
idx = s.index('宇宙学的研究对象是天体运动和它的第一起因')
#查看是否我们刚才删掉的内容
#如果不是,可以让s = s[idx+len('宇宙学的研究对象是天体运动和它的第一起因'):],重新执行上面的操作
print s[idx-100:idx+100] #逐步调整100这个参数,直到找到我们删掉的内容为止。
想不到Linux还留了这一手~我也是前几天误删了一个脚本,然后才Google到的,果然技术就是血与泪的教训所积累出来的。
参考 #
http://coolshell.cn/articles/2822.html
转载到请包括本文地址:https://kexue.fm/archives/4491
更详细的转载事宜请参考:《科学空间FAQ》
如果您还有什么疑惑或建议,欢迎在下方评论区继续讨论。
如果您觉得本文还不错,欢迎分享/打赏本文。打赏并非要从中获得收益,而是希望知道科学空间获得了多少读者的真心关注。当然,如果你无视它,也不会影响你的阅读。再次表示欢迎和感谢!
如果您需要引用本文,请参考:
苏剑林. (Jul. 16, 2017). 《Linux下的误删大坑与简单的恢复技巧 》[Blog post]. Retrieved from https://kexue.fm/archives/4491
@online{kexuefm-4491,
title={Linux下的误删大坑与简单的恢复技巧},
author={苏剑林},
year={2017},
month={Jul},
url={\url{https://kexue.fm/archives/4491}},
}
August 2nd, 2017
grep之所以能行 应该是得益于《Linux下一切皆是文件》的概念。 文件不一定是外存上,还可以是/proc/pid 目录下...