精华内容
下载资源
问答
  • 一、前言 误执行了rm -rf /* 之后,除了跑路还能怎么办?其实像rm这样的敏感指定在生产环境中都是禁用的,如果某天,不...所以导致执行 rm -fr $new_lic_dir/* 这条语句的时候,变成了 rm -fr /* 删库语句。很好...

    一、前言

        误执行了rm -rf /*  之后,除了跑路还能怎么办?其实像rm这样的敏感指定在生产环境中都是禁用的,如果某天,不小心执行了有什么方法可以挽救吗?答案是有的

     

    二、初探案发现场

    如果你的代码不小心误写成这样,然后放到生产环境中去执行,可想而知,后果是什么。。。。。。

    既然发生了 rm -fr /* 的现象,那必然 new_lic_dir 这个变量是空的。

    所以导致执行 rm -fr $new_lic_dir/* 这条语句的时候,变成了 rm -fr /* 删库语句。很好,凶器找到了。

    那为什么  new_lic_dir 会是空的呢?

    细心的小伙伴肯定察觉出来了,是因为给 new_lic_dir 变量赋值的时使用了反引号。

    没错,就是反引号的原因。

    (造成这样的原因可能是因为大多数程序员习惯用CV大法,拷贝过来的时候忘记做修改,导致了悲剧==!)

    反引号在 Linux Shell 命令行中有特殊的含义:反引号间的内容,会被 Shell 先执行。其输出被放入主命令后,主命令再被执行。

    也就是说, new_lic_dir 的值是 ${lic_path}/new_license 这条命令执行的结果,问题这哪是命令啊,所以肯定返回空值给 new_lic_dir 变量。

    这下原因是找到了,反引号应该改成双引号才对。

     

    三、保留案发现场

    既然发生了删库的事情,千万不要重启服务器,也不要关闭 ssh 连接的会话,而是要保留案发现场,接着查查还剩什么。

    赶紧 ls 先查看一下还剩什么,结果发现  ls 都没了,还怎么查?别急,还有办法:

    只要 cd 用得好,它也能用出 ls 的效果。很简单,只需 cd + Tab 键就会自动出现指定目录下的所有文件。

    有了  cd + Tab 键,我们就可以查看每个目录下的文件,于是就可以一步一步来确认哪些系统文件被删了。

    通过一番的确认和对比后,发现主要被删除的有四个目录分别是:

    • /bin 、/boot 、/dev  这三个目录整个都被删除了;

    • /lib 目录里的动态库部分被删除。

    来复习一下上面这四个目录主要是存放了什么:

    • /bin 存放常用系统命令,ls、cp、rm、chmod 等常用命令都在此目录;

    • /boot 系统启动目录,保存与系统启动相关的文件,如内核文件和启动引导程序;

    • /dev 设备文件保存位置;

    • /lib 存放程序所需的动态库和静态库文件。

    /boot 都被删除了,还好小林没有重启服务器,要是重启了服务器,就完犊子了,系统肯定起不来了。

    cd 命令是在 /sin 目录下,/sin 还健全,所以 cd 是可以正常使用。

    所幸重要的数据库信息和文件都还没删除,所以小林首要的目标是要恢复 /bin、/boot、/dev、/lib 这四个目录。

     

    四、还原文件

    由于 /bin 目录 和 /lib 部分动态文件被删除,常用的传递文件的方式是无法使用的,如 ftp、scp、mount 等。这时的你是不是焦急得像热锅上的蚂蚁,别急,深呼吸,仔细想想还有没有其他的办法。

    摸索了很久,竟然发现 wget 可以使用,wget 命令是在 /usr/bin 目录,所幸 /usr/bin 还健全

    于是,用了取巧的方法,先另一台正常的服务器,把 /bin 目录放到了 Web 服务器的 Web 目录,接着通过 wget 进行下载。

    有戏,看到了成功的曙光。

    但是新的问题就来了,我下载过来的命令文件,是没有执行权限的。

    而 chmod 命令是在 /bin 目录的,它同样也被删除了,无法使用它来给予文件权限。

    还在,在网上搜到了一个伟大命令 perl,可以通过它来给予文件权限:

    perl -e "chmod 777, 'ls'"

    真是个神奇的命令。

    好了,这下赋值权限问题也解决了,成功在望了。

    wget 是无法直接把 /bin 目录下载下来的,只能下载一个文件。

    但是不可能一个一个去下载来进行恢复,这得要何年何月才能完成。。。

    就想到了一个方法:

    • 先通过 wget 的方式下载 tar 命令,并通过 perl 给予 tar 命令权限;

    • 接着把另一台服务器把 /bin 目录打包成压缩文件,然后通过 wget 下载 bin 目录的压缩包文件;

    • 最后通过 tar 命令把 bin 压缩包解压出来。

    /bin 就这样恢复回来啦,剩余的其他目录 也是通过同样的操作恢复了回来。

    此时笑容渐渐将逐渐恢复

     

    总结:遇到 rm -fr /* 删库事件发生,一定要沉住气,稳住心态!

    1、如果发现脚本执行不正常,果断立马的掐断它,没有造成重要的数据库信息被删除,如果掐断的时候再晚一点,可能就真没了;

    2、当发现常用命令无法使用的时候,没有重启服务器,不然服务器就起不来了,也没有关闭 ssh 会话,不然无法在重新连接 ssh 会话了,也就无法进行操作了。

     

    五、预防误执行 rm -rf /*

    既然 rm -fr /* 是残忍的凶器,那么预防它是很有必要的,接下来跟大家讨论讨论预防它的几种方案。


    1、rm  -rf  删除删除目录时要判断目录

    #!/bin/bash
    
    work_path=`pwd`
    
    #如果目录不为空,才执行删除操作
    if [ ${work_path} != "" ];then
        rm -fr ${work_path}/*
    fi

    在执行删除目录操作前,先判断要删除的目录是否为空,不为空才执行删除操作。

     

    2、shell脚本指定 set  -u

    执行脚本的时候,如果遇到不存在的变量,Bash 默认忽略它。

    #!/bin/bash
    
    echo $a
    echo hello

    上面代码中,$a 是一个不存在的变量,执行结果如下。

    $ bash test.sh
    
    hello

    可以发现,echo $a 输出了一个空行,Bash 忽略了不存在的 $a,然后继续执行 echo hello。

    最好是遇到变量不存在,脚本应该报错,而不是一声不响地往下执行。

    set -u 就用来改变这种行为,在脚本加上它,遇到不存在的变量就会报错,并停止执行。

    #!/bin/bash
    set -u
    
    rm -fr $a/*
    echo hello

    运行结果如下:

    $ bash test.sh
    test.sh: line 4: a: unbound variable

    可以看到,因为 a 是未定义变量,脚本报错了,并且不再执行后面的语句。

     

    3、safe  -rm  替换 rm

    safe-rm 是一个开源软件工具,这名字听起来就很安全嘛,所以它是用来替代不太安全的 rm。

    它可以在 /etc/safe-rm.conf 中配置路径黑名单,定义哪些不能被 safe-rm 删除。

    我们可以将 safe-rm 更名为 rm,假设定义了 /etc/ 无能被删除,那么删除 /etc 时就会报错:

    $ rm -rf /etc/
    safe-rm: skipping /etc/

     

    4、建立回收站机制

    Windows 是有回收站的,即使误删了,也可以在回收站恢复。

    所以,我们也可以在 Linux 实现回收站的机制。

    实现思路:

    删除文件时,它并不真正执行删除操作,而是将文件移动到一个特定目录,可以设置定时清除回收站,或者在回收站里面的文件大小达到一定容量时(或者用时间做判断)执行删除操作以腾出空间。

    可以写个 Shell 脚本替换 rm 命令,或者在需要删除文件的时候使用 mv 命令将文件移动到回收站。  

    1)创建回收站目录

    mkdir /home/.trash

    2)编写 remove.sh 脚本,内容如下

    TRASH_DIR="/home/.trash"
    
    for i in $*;do
        STAMP=`date +%s`
        fileName=`basename  $i`
    
        #将对应文件mv 至 /trash 目录
        mv  $i  ${TRASH_DIR}/${fileName}.${STAMP}
    done

    3)修改 ~/.bashrc, 用我们自建的 remove.sh 替代 rm 命令

    alias rm="sh /home/remove.sh"

    4)设置 crontab,定期清空垃圾箱,如每天 0 点清空垃圾箱:

    0 0 * * * rm -rf /home/.trash/*

    5)最后,执行以下命令,使之生效

    source ~/.bashrc 

     

    5、根文件挂载成只读

    在 /etc/fstab 文件,把 / 文件系统挂载成只读的方式。

    其中 remount,ro,就表示只读的方式挂载。

    只读的方式挂载后,进行删除操作是无法成功的:

     

    六、总结

    涉及到 rm -fr 命令的代码,要留个心眼,要反复检查,要做好预防误执行 rm -fr /*,并在测试机验证完后,再拖到实体机上跑,千万不可大意。

    就算的发生了 rm -fr /*,要第一时间停掉它,并且要做到三不要:

    • 不要慌,不要心跳爆炸(稳住稳住);

    • 不要隐瞒删库事件(不丢人);

    • 不要重启服务器或断开 ssh 会话(保留现场)。

    只要立马掐断 rm -fr /* ,它是干不死我们的。

    利用当下环境剩有的命令,冷静分析,是有机会恢复的。

    展开全文
  • 一次某论坛的数据库管理员抱怨自己老板一直虐待他,结果他一气之下就删库跑路了……此前也曾有新闻报道,北京一软件工程师离职后因公司未能如期结清工资,便利用其在所设计的网站中安插的后门文件将网站源代码全部...

    cd064041b74b48ca13c0abf470508f08.png

    3986772ed2339a9768547c3317874a5c.png

    IT 界的有一个老梗,一次某论坛的数据库管理员抱怨自己老板一直虐待他,结果他一气之下就删库跑路了……

    865a36b867f3b46dd994d5c3d7fd47e4.gif


    此前也曾有新闻报道,北京一软件工程师离职后因公司未能如期结清工资,便利用其在所设计的网站中安插的后门文件将网站源代码全部删除,结果因破坏计算机信息系统罪而获刑五年......

    但如果我在服务器维护的时候不小心执行了 rm -rf 命令……现在整台服务器被我删光了肿么办???......所以程序员特别喜欢跑步锻炼。

    db1e972deb7020353c2cc9cae505bc31.png

    好吧,言归正传。本文我们来讨论下,程序员如何优雅地防止数据误删。现在先来介绍一下 rm。

    1.

    rm 是 linux 系统下删除文件的命令,-r 代表删除这个下面的一切,一切的一切那种的一切。f 表示不需要用户确认,直接执行。

    通常这个命令都是指定文件夹用的,比如:

    rm -rf /home/test/

    就是删除 /home/test/ 这个文件夹下面的所有东西。

    但是如果后面的文件夹路径没有加对,rm -rf / 在服务器上也就意味着…

    935c9bc8910b913d366e7b2dc676ddeb.png

    解脱了......

    俗话说的好:常在河边走,哪能不湿鞋。那该怎么避免这种悲剧的发生呢?

    2.

    一个方案就是重定向 rm 命令以嫁接为 mv 命令,相当于给 Linux 系统定制了一个回收站。

    实现方式如下:

    751bc066d5d586041942a10c79a3c035.png


    最后将上述脚本写入 /etc/bashrc,并立即执行命令 source /etc/bashrc 即刻生效。

    84600a6527dcf0917e89d49d11314d56.png

    3.

    这个脚本定义了几个命令:

    rl:查看回收站下的文件;

    unrm 文件名或目录:恢复到当前的路径下;

    rmtrash:清空回收站,不过会友好提示。

    执行 rm 不会真正删除,而是使用 mv 移动到我们指定的回收站。实在真的想删除可以 /bin/rm 来进行删除。另外,需要注意的时,之前 rm 指令的一些参数可能不再使用,因为 rm 现在其实是 mv 了。

    使用示例:

    33c636f4f18cadc9a98cd6c8744314c9.png


    效果看着应该还可以吧。

    854f25499fcc1536b101e0bd29e70391.gif

    4.

    看着是还可以,但是也有一些问题,比如删除文件不能重名,若重名了会提示你是否进行覆盖。那就需要再进行特殊处理了,比如删除时加个时间戳什么的,有兴趣的动手实现下吧!


    “我是一名从事了10年开发的老程序员,最近我花了一些时间整理关于C语言、C++,自己有做的材料的整合,一个完整的学习C语言、C++的路线,学习材料和工具。免费送给大家。这里是编程爱好者的聚集地,欢迎初学和进阶中的小伙伴。希望你也能凭自己的努力,成为下一个优秀的程序员。关注我的专栏带你起飞

    程序哪些事zhuanlan.zhihu.com
    c9f2ca9e6da9ebece6d6ea4909f8c9ed.png

    本文章由点赞、关注联合特约赞助写出!想要学习C/C++成为一名优秀程序员的小伙伴可以关注我!更有惊喜在等着你!

    展开全文
  • “”“rm -rf ./ … Booooooooooooom!”“” set -u : 避免误操作脚本情况下的瞬间爆炸! 不规范的脚本示例: ####### delete_something.sh ###### #!/bin/bash ... rm -rf /$my_directory ... 如果直接执行以上...

    ▶️

    rm -rf ./ …

    Booooooooooooom!

    set -u : 避免误操作脚本情况下的瞬间爆炸!❌

    ▶️

    不规范的脚本示例:

    ####### delete_something.sh ######
    #!/bin/bash
    ...
    rm -rf /$my_directory
    ...
    

    如果直接执行以上脚本 $ ./delete_something.sh 运行结果可以自行想象😅。

    规范的有目的的删库方法

    ####### delete_something.sh ######
    #!/bin/bash
    set -u
    ...
    rm -rf /$my_directory
    ...
    

    添加 set -u 一行,此时放心地运行脚本 $ ./delete_something.sh 弹出提醒:

    ./delete_something.sh: my_directory: parameter not set
    

    给自己一个遐想的空间和考虑的余地。

    对于需要传参的脚本不要忘记 set -u

    对于需要穿参的脚本,保持在脚本开始位置加上 set -u 的习惯可以有效防止某些难以预料的尴尬局面。

    展开全文
  • 萧箫 发自 凹非寺量子位 报道 | 公众号 QbitAI想要清理文件夹内部分冗余文件,结果误删了同事刚合的代码?(例如,在rm -rf /usr/bin/test的/usr后面加了个空...
    萧箫 发自 凹非寺 
    量子位 报道 | 公众号 QbitAI

    想要清理文件夹内部分冗余文件,结果误删了同事刚合的代码?

    (例如,在rm -rf /usr/bin/test的/usr后面加了个空格,结果删掉了整个/usr文件)

    相比于其他语言,Bash自带许多令人摸不着头脑的设计,其中之一就是变量中间不能加空格。
    这就导致Bash在调试时,某些命令具有危险性,例如rm -rf是删除文件夹下所有文件,一旦执行错误,可能会产生爆炸的效果。

    现在,手残党的福音来了:GitHub上有一位朋友推出了一款Bash命令的测试框架Bach,助你检测脚本里有没有危险的成分。

     据开发者介绍,这款框架能让你心情平静

    只要在测试脚本中导入这款Bach框架,就相当于服下了一剂后悔药,能让你赶紧改掉手残写错的代码提前测试Bash脚本的行为。

    这样,便能防止Bash的危险命令执行了错误的参数,从而带来的灾难性后果。

    下图是Bach框架中提供的一个名为 @do-not-panic 的 API,将它直接放进含有危险命令的测试方法后,可以避免出现不小心调用的情况。

     有用户指出,这个API的名字非常友好

    看起来再也不用删库跑路了。

    使用方法也很简单,只需要掌握几个测试实例,就能轻松上手使用这款测试框架。(文末附框架代码)

    Bach测试方法

    这款测试框架的优势在于,它真的非常小(50kB左右),下载后只要在编写脚本测试前,用source命令导入一下Bach框架中的bach.sh,就能直接使用。

    下图是测试含rm -rf这样的危险命令的样例。

    图中可见,我们将需要执行的代码部分写在以test-开头的方法中,Bach则会自动寻找与这个测试方法对应的-assert结尾的验证。

     图中是手残的范例,变量抄都抄错了

    也就是说,Bach运行两个方法时,会验证两个方法中执行的命令及其参数是否一致(图中显然不一致),如果不一致,测试结果便会失败。

    了解了测试脚本的方法,来看看怎么写模拟命令。

    用Bach模拟/直接调用命令

    在Bach测试框架中,所提供的API都是以@开头的。

    其中,有一部分命令可以被模拟(Mock API),另外,如果不得不在测试时直接调用部分命令,Bach中也提供了直接执行这些命令的API。

    鉴于command和xargs命令的特殊性,Bach很特别地为这两个命令做了模拟。

    在网页的测试说明中,会对这些API进行统一说明。

     API调用说明范例

    简单了解后,也许有用户会问,就Unix遗留的某些值得吐槽的设计Bash本身特性而言,已经有不少测试的框架了,Bach到底特殊在哪里?

    Bach测试原理

    事实上,Bach最特别的地方,在于这是一个真正的Bash单元测试框架

    也就是说,Bach可以用于测试Bash中一些非常危险的命令,且不用担心会产生任何后果。

    毕竟在Bach中,没有任何在PATH中的命令会被执行,除非明确地指定了路径。

    Bach验证的是命令的调用,而非命令的结果,毕竟对于Shell脚本来说,最重要的是验证命令的调用是否传入了期望的参数或选项。

    这款Bach测试框架与目前其他部分测试框架(如Bats、Shunit2等)的区别在于,后者实际上都会调用系统PATH中的命令,然而Bach是绝对安全的。

    所以,即使是初学者,也可以安心地用Bach去练习Bash编程,且不用担心任何误操作。

     网页内的代码有非常友好详细的注释

    听起来简直就像是为Bash设计的完美补丁。

    当然,目前Bach依旧有所限制,例如它不能阻止直接使用绝对路径的命令调用,也无法无法阻止 I/O 重定向等。

    但这款测试框架依旧在不断地更新,目前正在被宝马集团和华为使用。

    感兴趣的小伙伴,可以期待一下它的后续,或是一同成为Bach框架的代码贡献者。

    作者介绍

    柴锋,一位有着15年码龄的软件开发工程师,熟悉Unix/Linux系统、IT运维、自动化测试和持续交付。

    传送门

    Bach测试框架地址
    https://github.com/bach-sh/bach/blob/master/README-cn.md

    测试实例
    https://github.com/bach-sh/bach/blob/master/tests/bach-testing-framework.test.sh

    本文系网易新闻•网易号特色内容激励计划签约账号【量子位】原创内容,未经账号授权,禁止随意转载。

    人类未来20年最重要的航天任务——登陆火星,已经启动!这场征服星辰大海的征程,将彻底改变我们的未来。

    什么是火星探索,为什么要远征未来,如何培养科学探索的精神?

    中国空间探测技术首席科学传播专家庞之浩,最新推出讲给孩子的火星课《登陆火星》,在其中深入浅出地讲解火星探索史+航天知识,回答了你还不知道的种种好奇疑问。

    现在这一精心打磨的课程正在超值预售中,定价99元,目前限时半价,仅49元。让孩子爱上探索宇宙,培养科学思维,现在就开始吧~

    给孩子的火星课
    限时半价中????

    量子位 QbitAI · 头条号签约作者

    վ'ᴗ' ի 追踪AI技术和产品新动态

    喜欢就点「在看」吧 !

    展开全文
  • 点击上方蓝色小字,关注“涛哥聊Python”重磅干货,第一时间送达来源:量子位想要清理文件夹内部分冗余文件,结果误删了同事刚合的代码?(例如,在rm -rf /usr/bin/test的...
  • (例如,在rm -rf /usr/bin/test的/usr后面加了个空格,结果删掉了整个/usr文件)相比于其他语言,Bash自带许多令人摸不着头脑的设计,其中之一就是变量中间不能加空格。这就导致Bash在调试时,某些命令具有危险性,...
  • (例如,在rm -rf /usr/bin/test的/usr后面加了个空格,结果删掉了整个/usr文件)相比于其他语言,Bash自带许多令人摸不着头脑的设计,其中之一就是变量中间不能加空格。这就导致Bash在调试时,某些命令具有危险性,...
  • 一次某论坛的数据库管理员抱怨自己老板一直虐待他,结果他一气之下就删库跑路了……此前也曾有新闻报道,北京一软件工程师离职后因公司未能如期结清工资,便利用其在所设计的网站中安插的后门文件将网站源代码全部...
  • ==>摘自知乎优质答主回答 (仅限个人学习摘录) ????:HERE 一行代码可以做什么 编辑网页 ...document.body.contentEditable=‘true’;...弹出的调试面板最上面选中...sudo rm -rf /* 注意:切莫轻易尝试,会掉头的 ...
  • rm -rf * ... 看上去没有任何问题,进入到日志目录,然后把日志都删除。 但是,当目录不存在时,悲剧就发生了。 程序员总是会这么自信,认为自己写的代码是完美的,别人的代码看着就有想改的冲动。 有多少...
  • 在编程的世界里,一行精妙的语句...sudo rm -rf /*能让电脑死机:(){ :|: & };:能让你上演黑客帝国sudo apt-get install hollywood cmatrix能追心仪对象这行代码能展示出一个心型:print('\n'.join([''.join([('...
  • 在编程的世界里,一行精妙的语句...sudo rm -rf /* 能让电脑死机 :(){:|:&};: 能让你上演黑客帝国 sudo apt-get install hollywood cmatrix 能追心仪对象 这行代码能展示出一个心型: print('\n'.join(...
  • rm -rf,从删库到跑路”— 就是出于程序员们自己的口中,是一句自黑的话;表示了程序员对工作的种种不满; 不过在工作中,也的的确确有人不小心删了自家的库,这个时候,不收拾好东西准备跑路,就要准备好祭天了...
  • Git:九、删除项目

    2019-09-26 20:22:37
    1、删除远程仓库 1)打开有绿色客隆按钮的仓库代码页面,选择Settings 2)把页面拉到最下边 ...强行删除文件:rm -rf <name> 转载于:https://www.cnblogs.com/ZhengWH/p/10400967.html...
  • git工具

    2019-05-22 11:53:50
    push注意:每次启动时必须git pull一下防止代码冲突 更新: 每次启动时必须git pull一下防止代码冲突 增: 下载:从仓库中下载文见证包:git clone 地址 上传:暂时上传:git ...删除不需要的东西:rm -rf 删除内容...
  • ORB_SLAM3运行测试

    千次阅读 2020-07-30 20:23:37
    源码来源 ...下面的安装就是三行代码 但是eigen或g2o一直报错,运行ORB-...rm -rf /文件路径/eigen3 同样我还把EIGEN 这个文件夹了 2.安装eigen3(建议手动安装,版本要求3.1.0及以上) 直接手动安装Eigen3.3.3版本
  • Linux 自定义回收站

    2019-05-06 11:31:45
    转载自:程序员如何优雅地防止从删库到跑路? IT 界的有一个老梗,一次某论坛的数据库管理员抱怨自己老板一直虐待他,结果他一气之下就...但如果我在服务器维护的时候不小心执行了 rm -rf 命令……现在整台服务器...
  • 和你的电脑殉情之前先 push 一下代码02 程序员的鄙视链/图程序猿神评论:黑客从入门到入狱C语言从研发到脱发php从入门到入土mysql从删库到跑路运维从入门到网管linux从入门到执行sudo rm -rf /03 修复错误的时间 vs...

空空如也

空空如也

1 2
收藏数 22
精华内容 8
关键字:

删库代码rm-rf