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

关于 rm -rf /有感

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

    刚刚看到了这个帖子 就在刚刚,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  
       2019-12-21 01:54:25 +08:00

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



    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  
       2019-12-22 02:40:43 +08:00
    所以有上堡垒机的必要性
    realpg
        35
    realpg  
       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 恰恰所有路径使用绝对路径才安全
    coolloves
        38
    coolloves  
       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  
       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   ·   实用小工具   ·   1389 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 17:42 · PVG 01:42 · LAX 09:42 · JFK 12:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.