关于 rm -rf /有感 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
CatCode
V2EX    Linux

关于 rm -rf /有感

  •  1
     
  •   CatCode 2019-12-21 00:50:40 +08:00 10367 次点击
    这是一个创建于 2126 天前的主题,其中的信息可能已经有所发展或是发生改变。

    刚刚看到了这个帖子 就在刚刚,rm -rf 删软连接的时候后面多加了个 /,现在杯具了 ,又想起了我在 你们平时用 Linux 时喜欢用 root 用户吗 里回复的

    我大 root 敢死队什么时候怕过?

    结合最近发生的一件事情说一下:
    某些发行版的 rm 是默认--preserve-root 的,所以rm -rf /并没有什么卵效果。当然我不确定指定了多个路径的情况。我用过的发行版不多,作死也不多,这一条如果有知道的更多的,欢迎指正。

    然后,在讨论rm这个问题的时候,总有人会说alias rm to mv。我想说,其实这样并不能挡住误操作。 这里举一个就前不久在我这里发生的真实例子:
    (背景:高校非计算机科学相关专业的科研机群) 在一台节点机上,给新人“练手”:用 root 编译安装一个软件。新人打算备份一下某些数据,但是误操作mv /* bak/(通配符前多打了一个斜杠)新人还真“新”,没搞懂乍回事儿,觉得怎么突然这么慢,也没按 Ctrl +C。等了好久才反应过来,叫来前辈看情况。
    此时,各种 bin 已经都被移走了,所有命令都是各种command not found,然后新人居然一个 Ctrl+D 退掉了 SSH当时那台机器最后一个 SSH 连接。
    最后,迫于那台机器上没啥值得抢救的数据,直接重装了,省事儿。

    可以看到,rm是有一些重要路径的保护措施的,而mv没有。而总所周知mv是不会丢失数据内容,而rm是可能导致数据丢失的(数据恢复不是 100%保证成功)。

    起一个别名并不能解决问题。

    然而,删掉了系统,真的有那么可怕吗?我觉得不是,重装系统太简单了。
    真正可怕的是删掉、系统上产生的还有价值的数据、删掉部署在系统之上的技术栈、以及机器掉线带来的其他负面影响。
    并没有系统命令可以帮你保护这些内容

    那我们能做什么呢?老生常谈了:
    在敲下回车之前,留个心,多看一眼,仔细一点。
    勤备份:不仅仅是备份数据,还有软件架构的冗余、人员的冗余等等。

    最后,感谢大家深夜听我逼逼这么多。

    45 条回复    2019-12-26 09:06:12 +08:00
    MadHouse
        1
    MadHouse  
       2019-12-21 01:01:04 +08:00 via Android
    用 rm , 尽量不同 rm-rf
    nvkou
        2
    nvkou  
       2019-12-21 01:11:14 +08:00 via Android
    所有路径都使用相对路径不好吗? 多 cd 多./不好吗?
    iamwho
        3
    iamwho  
       

    真正可怕的是删掉、系统上产生的还有价值的数据、删掉部署在系统之上的技术栈、以及机器掉线带来的其他负面影响。
    并没有系统命令可以帮你保护这些内容。



    alias rm to mv 就不是为了防止误操作,而是防止误操作造成数据丢失,所以你的说法不成立。
    wtks1
        4
    wtks1  
       2019-12-21 01:56:18 +08:00 via Android
    给新手低权限账号就行了
    KentY
        5
    KentY  
       2019-12-21 02:01:18 +08:00
    关于"喜欢用 root 用户吗"那个帖, 我上来就回复了, 这个听别人怎么劝都没用, 吃一堑才能长一智.

    我做过比 rm /这个更蠢的事, 因为写脚本拷贝,粘贴, 结果粘贴的历史记录没弄好, 把无关命令贴进脚本, 把整个硬盘擦了, ssd 很快... 但是机器还正常运行了大概几十秒..我还排错呢..:D 所以在很多方面有教训并不是坏事. 当然要是没备份就另说了.

    @MadHouse
    当你在做一个工作, 发现截然不同路径的 n 个文件 /目录需要处理(比如说 rm), 你怎么做, cd n 次吗?
    实际操作中, 可能 3 次就是极限了
    iamverylovely
        6
    iamverylovely  
       2019-12-21 04:09:36 +08:00
    mv /* bak/也有可能是少打了一个点。mv ./* bak/
    carpRed
        7
    carpRed  
       2019-12-21 06:37:26 +08:00 via Android
    我也记得是被限制过得,无奈很多人喜欢玩这个梗,看不起我大开源社区
    ihipop
        8
    ihipop  
       2019-12-21 07:54:05 +08:00 via Android
    pip install trash-cli
    mostkia
        9
    mostkia  
       2019-12-21 09:11:56 +08:00
    我删除东西都是用 rm -i 的,就怕删错东西
    lcdtyph
        10
    lcdtyph  
       2019-12-21 10:09:11 +08:00
    多用 tab 补全,可以避免很多路径输入错误的问题
    deorth
        11
    deorth  
       2019-12-21 10:31:10 +08:00
    可以像我司一样,每半个月开一次会,培训安全生产,输出心得。每月抽查安全生产守则和处罚条例。出线上重大事故的,扣 5000 开除。所有上级上管本季度绩效为 C,按级别扣钱。
    HuLiY
        12
    HuLiY  
       2019-12-21 11:58:07 +08:00
    忘记了从哪看到的一个程序员的原则:在每个文件夹下新建 recycle 文件夹,删除文件统一用 mv ./recycle,然后定期删除 recycle。虽说不能完全避免误删风险,但也相当于多了一道保护。

    话说回来,误删这种事情,只能降低风险,没法完全避免。
    hoyixi
        13
    hoyixi  
       2019-12-21 12:33:03 +08:00
    如果是公司的环境,背后透射出的是管理烂,正规点的公司,员工账号能干些啥规定的死死的,根本没有权限,想删也删不了。 而且通常,环境一般也是专门或者隔离的,最坏情况也造成不了多大灾难。
    zr8657
        14
    zr8657  
       2019-12-21 12:42:09 +08:00
    之前有一次上午操作一台生产机器,中午休息完下午再操作的时候发现生产环境的应用都被删了。当时汗都下来了,那感觉真是一言难尽,折腾到半夜也没弄好,随手看了下 rm rf 的命令执行时间发现是中午,然后就回家睡觉了。
    yuzenan888
        15
    yuzenan888  
       2019-12-21 13:01:03 +08:00   1
    我记得我经历过最惨的一次是 rm -rf ./* 忘了加点,发现问题后 3 秒内按了 Ctrl + C,回过神来发现 /bin、/boot 已经被删掉了,但由于当时根目录下还有个 /data 目录,这个目录挂载到 samba 磁盘上,当时估计 samba 服务器上的硬盘还处于休眠状态没启动,IO 卡在这里了,回过头检查的时候发现 /data 目录毫发无损……真是庆幸!当时用的是 CentOS 系统,/bin 是软链接到 /usr/bin 的,所以 /usr/bin/ln -s /usr/bin /bin 恢复,然后再从新装系统上拷贝 /boot 过来就没事啦。

    我觉得可以通过在根目录上建一个名字为 1 的目录,然后往里面塞入大量的零碎小文件(十万个)来减缓损失,当然只是预防手贱而已。
    CatCode
        16
    CatCode  
    OP
       2019-12-21 13:24:55 +08:00
    @iamwho `mv`就安全了吗?`mv`和`cp`在文件名相同的情况下,默认的行为是覆盖喔。举个例子,
    ```bash
    cp test.conf test.conf.bak #创建备份
    vi test.conf #大量的编辑
    ##略:其他的很多操作
    cp test.conf test.conf.bak #原本想 vi test.conf,使用上下箭头键切命令时多切了一个
    ```
    这样,你的备份 test.conf.bak 就没了。

    我在文中想引申出来的是:每个命令都是有一定的风险的,只是风险等级不同。
    难道只有“误删数据”才叫“事故”吗?
    mv、cp、>覆盖掉了已存在的文件
    >>追加的内容和原有内容无法区分
    UPDATE WHRER 的条件输错修改了不该修改的位置
    apt install 把某个依赖升级到了并不兼容的高版本
    ...
    甚至是 Windows 上,删除文件点了“是”,点开了回收站又点到了“清空”,再次确认还点了“是”这样的三重防护都挡不住的没睡醒。

    我认为每个用户都应该在执行命令前,能明确这个命令会有哪些作用。
    而对于现有的容错设计,我们必须明白其容错能力并非无限。
    JamesR
        17
    JamesR  
       2019-12-21 13:40:55 +08:00
    每小时快照一次,怕个球。
    no1xsyzy
        18
    no1xsyzy  
       2019-12-21 14:17:16 +08:00
    是在 GNU coreutils 6.2 版本修改的这一默认行为(--preserve-root )
    https://git.savannah.gnu.org/gitweb/?p=coreutils.git;a=log;h=refs/tags/COREUTILS-6_2
    BSD、Mac 和非 GNU 的 Linux 都不清楚,Minix 我盲猜是没默认 --preserve-root 的
    msg7086
        19
    msg7086  
       2019-12-21 15:59:39 +08:00   1
    敲下回车之前多留心才是真的。
    sudo 也好 mv 也好,管不住自己的回车键,一样总有一天会冲破安全措施的。
    养成危险动作前再三确认,以及脑子不好使的时候不要瞎瘠薄操作的习惯。
    CivAx
        20
    CivAx  
       2019-12-21 16:11:12 +08:00
    严格上来说 mv 的杀伤性可比 rm 大多了……

    rm 看起来就凶神恶煞,对付 rm 的人都小心翼翼

    mv 看起来人畜无害,给错参数就直接完蛋
    xiaomingVTEX
        21
    xiaomingVTEX  
       2019-12-21 16:18:17 +08:00
    能力越大, 责任越大
    niming007zh
        22
    niming007zh  
       2019-12-21 18:18:40 +08:00
    @yuzenan888
    为什么不敲 rm -rf *呢
    paopjian
        23
    paopjian  
       2019-12-21 20:45:57 +08:00
    请问这种连基本命令都没法用了怎么修复回去呢?
    yuzenan888
        24
    yuzenan888  
       2019-12-21 21:00:25 +08:00
    @niming007zh 习惯问题……经常执行脚本文件都是这样输的。
    CatCode
        25
    CatCode  
    OP
       2019-12-21 21:08:43 +08:00
    @paopjian 硬盘拆下来,找别的机器挂上,尝试 mv 回来
    xuanbg
        26
    xuanbg  
       2019-12-21 21:15:22 +08:00
    命令总有输错的时候,这个时候能挽救你的唯有备份。纠结 root 或者 user,rm 还是 mv,其实真的没有意义。

    把数据和应用分开存放,多玩 Docker,少玩系统。不要觉得自己能耐,设置了足够多的安全保障,不会错。淹死的都是会水的
    xuanbg
        27
    xuanbg  
       2019-12-21 21:17:37 +08:00   1
    真正的安全不是追求不犯错,而是允许犯错,而且不怕你犯错。
    KnothHe
        28
    KnothHe  
       2019-12-21 21:28:04 +08:00
    我现在是在桌面使用 Linux 的时候尽量不用 rm,改用 trash 了。实在是害怕意外删除有用的文件又没办法恢复了。
    SaigyoujiYuyuko
        29
    SaigyoujiYuyuko  
       2019-12-21 21:51:56 +08:00
    还是仔细看好吧 233
    charlie21
        30
    charlie21  
       2019-12-21 23:35:58 +08:00
    倒霉就是倒霉
    mokeyjay
        31
    mokeyjay  
       2019-12-21 23:45:07 +08:00
    我已经非常习惯在录入任何路径前使用 ./ 了,这俩键挨在一起,按着还挺顺手
    sola97
        32
    sola97  
       2019-12-22 02:18:25 +08:00 via Android
    习惯性打 tab 二次确认
    mwftts
        33
    mwftts  
       2019-12-22 02:28:15 +08:00 via Android
    所以可以把一次回车改成两次回车吗
    mytsing520
        34
    mytsing520  
    PRO
       2019-12-22 02:40:43 +08:00
    所以有上堡垒机的必要性
    realpg
        35
    realpg  
    PRO
       2019-12-22 10:39:54 +08:00
    真不知道菜鸡运维都哪来的勇气-r 和-f
    sxd96
        36
    sxd96  
       2019-12-22 12:50:38 +08:00 via iPhone
    没有用的,习惯问题。
    按说 windows 该没问题吧 gui 的,我室友非要 shift del,拦都拦不住,误删过不止一次课件啊报告啊什么的。
    还是要好习惯。
    b00tyhunt3r
        37
    b00tyhunt3r  
       2019-12-22 12:55:22 +08:00 via iPhone
    @nvkou 恰恰所有路径使用绝对路径才安全
    sparkssssssss
        38
    sparkssssssss  
       2019-12-22 13:36:51 +08:00 via Android
    所以我现在基本不用星号,能不用 r 就不用,
    CatCode
        39
    CatCode  
    OP
       2019-12-22 16:12:11 +08:00
    @realpg 比如你要删一个有.git 目录的目录,就要用到-rf,不然一个一个按 y 会累死的
    @sxd96 Windows 下删 U 盘 /储存卡里的东西是不经过回收站的,不要问我是怎么知道的
    realpg
        40
    realpg  
    PRO
       2019-12-22 18:47:40 +08:00
    @CatCode #39
    不用 r 不用 f 当然不行

    我的意思是菜鸡运维哪来的勇气看都不看审都不审就回车 很潇洒么
    MadHouse
        41
    MadHouse  
       2019-12-22 19:38:36 +08:00 via Android
    @KentY 批量操作当然用 sh 脚本,不过我是 emacs 重度用户,习惯用 dired 模式
    nnnToTnnn
        42
    nnnToTnnn  
       2019-12-23 10:35:15 +08:00
    话说执行 rm -rf 这个命令的时候你们都不检查一下的吗?

    每当执行以下命令我至少都会看三遍以上进行确认。

    1. rm -rf xxxx (linux 命令)
    2. delete from xxxxxx where xxx=xxx (sql 命令)

    这些命令我至少在按下回车之前检查三遍以上,以前同事会经常看见我写完一句 sql 或者 linux 命令就盯着屏幕看好久,然后我问为啥不执行 =。=
    nnnToTnnn
        43
    nnnToTnnn  
       2019-12-23 10:39:45 +08:00
    其次,还有就是为什么在 linux 用户下,用个 sudo 切换一下身份就这么难么? 假如你用的是 sudo 而非 root 身份。

    起码在报一堆的 xxx 无权限的时候 ctrl +c 还能解决问题。

    这让我又想到了之前一个 v2 的帖子,非要用 root 用户去操作服务器。

    1. 权利太大,容易误删数据
    2. root 身份启动的软件是具有 root 权限的。稍微一个漏洞整个系统全玩完
    no1xsyzy
        44
    no1xsyzy  
       2019-12-23 14:25:19 +08:00
    @nnnToTnnn 一个笑话:
    在 rm 之前先要沐浴更衣,点上一支沉香,呼吸,感受,敲入命令,闭眼,再睁开,回忆一下参数的含义,想象 shell 参数展开的结果,确认无误,按下回车。
    TynMh
        45
    TynMh  
       2019-12-26 09:06:12 +08:00
    既然知道是新手练手,为啥还要给 root 权限呢。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5437 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 49ms UTC 08:45 PVG 16:45 LAX 01:45 JFK 04:45
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86