V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
helphelp
V2EX  ›  程序员

除了 rm 之外就没有其他更安全的删除文件的方法吗?比如遇到删除系统核心的目录直接报错,或者提示没有权限,或者给强提醒,或者给个后悔药啥的。

  •  
  •   helphelp · 216 天前 · 5474 次点击
    这是一个创建于 216 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最起码不像 rm -rf 一样,删除/的话 什么提示都没有

    看了这两天的热帖,有两个都是因为 rm -rf 误删的,我自己之前说实话也执行过,想问一下有好的方法吗?

    73 条回复    2023-09-28 15:19:05 +08:00
    em70
        1
    em70  
       216 天前   ❤️ 22
    自己加的 f,还怪人不提示
    Vegetable
        2
    Vegetable  
       216 天前   ❤️ 1
    你是否在找 sudo
    unintialized
        3
    unintialized  
       216 天前
    直接改 rm 的源码, 把-f 这个参数给 nop 掉 <doge>
    realpg
        4
    realpg  
       216 天前   ❤️ 1
    对于一个合格的运维,rm 就不可能误删
    查 history
    习惯不好的都开了

    企业内规范定好,

    比如你想删除/home/a 下面的所有文件
    那么你应该要么切到 a 上级
    rm -rf a/*
    要么
    rm -rf a
    然后重新创建 a

    进入 a 目录再 rm -rf * 的 写岗位手册里全开除就完事

    这就是我公司我定的规则
    akira
        5
    akira  
       216 天前   ❤️ 1
    最好的办法就是不要登服务器。 其它方法都是治标不治本的
    timochan
        6
    timochan  
       216 天前   ❤️ 1
    不要盲目使用 ROOT 权限不就行了,需要的时候再 sudo
    ivvei
        7
    ivvei  
       216 天前 via Android
    @realpg a 后面手抖多敲一个空格你怎么破?
    realpg
        8
    realpg  
       216 天前
    @ivvei #7

    首先,习惯不好就是运维最大的问题。该多按 tab 的地方不按就是这结果

    手抖的造成重大事故是个人责任,劳动法琢磨好,离职补偿就省下啦
    nuk
        9
    nuk  
       216 天前
    在每次更改之前 snapshot ,直接给你回溯的机会
    cyningxu
        10
    cyningxu  
       216 天前
    这话问得,f 不是运行命令的人加的么
    Jirajine
        11
    Jirajine  
       216 天前 via Android
    @realpg #4 非常糟糕的规则,这样做麻烦不说,如果目录 a 有特殊的权限或其他 attribute 都会无法保留。
    rm -rf * 要么执行前按 tab 通过 glob expansion 把*替换成实际要删除的文件名,要么 alias rm='rm -I' 或者其他 trash cli 提供二次确认。
    不过这些都不能解决之前那个帖子容器环境下默认 shell 补全和配置都很受限的情况。
    ydpro
        12
    ydpro  
       216 天前
    记得之前 github 上有一个项目就是可以回滚输入的命令,但是忘记叫什么了。
    iblessyou
        13
    iblessyou  
       216 天前 via Android
    @em70 应该主要还是想找个 windows 回收站类似的。
    realpg
        14
    realpg  
       216 天前
    @Jirajine #11
    没说完而已 后面有说了完整的

    特殊权限的
    绝对目录或者切到上级
    rm -rf a/*
    不允许直接本机-f
    someonedeng
        15
    someonedeng  
       216 天前   ❤️ 3
    rm 改成移动到某个目录,然后定期清理
    joyhub2140
        16
    joyhub2140  
       216 天前   ❤️ 1
    都不如打快照来得安心。
    tairan2006
        17
    tairan2006  
       216 天前 via Android
    trash
    matchalatte
        18
    matchalatte  
       216 天前   ❤️ 1
    alias rm=trash-put
    trash-cli 类似于桌面环境的回收站,删除只是移到另一个路径,可以用 trash-empty 30 清理 30 天前的垃圾文件。
    https://github.com/andreafrancia/trash-cli
    Jirajine
        19
    Jirajine  
       216 天前 via Android
    @realpg #14 如果 a 是一个含有空格的目录名,仍然可能会导致误删除。而且切了工作目录忘切回去怎么办?要不规范再加一条切到上级不许用 cd ,必须用 pushd 和 popd 。

    其实如果 rm 是 GNU coreutils 提供的,直接要求使用或 alias 一个 -I 就可以了,该选项会在删除多个文件是提醒用户确认一次。
    realpg
        20
    realpg  
       216 天前
    @Jirajine #19
    公司环境不存在有空格的目录名 而且手册建议 tab 确认会自动加上引号

    你总是试图用那些特例来质疑已经稳定运行很久的规则 而我不可能把公司运维岗位规范手册那么厚的一本都贴 V2 论坛上

    感觉,您真的,就好像互联网上的那种运动器材成精生物……
    realpg
        21
    realpg  
       216 天前
    @Jirajine #19

    管理的艺术就是行政命令和技术结合,该行政命令时候就不要技术解决,该技术解决的不依赖行政命令

    而且,我已经从数据中心公司离职了 至少我治下的公司从来没出过任何这类事故,哪怕没有重大影响

    因为运维的 shell 的操作都是通过堡垒系统,所有指令甚至所有键盘按键都是记录的,隐形风险操作随便数据库写个查询就能列出来,一次不长脑子未造成恶劣影响可以学习,可以巨额罚款填坑大家聚餐,多次不长脑子的运维都没任何补偿的滚蛋了
    iseki
        22
    iseki  
       216 天前 via Android
    @realpg 很危险啊,/* 这种东西尽量不要出现,rm -rf / 都能保护住,谁手滑敲成 rm -rf sth /* 一点机会都不会有
    iseki
        23
    iseki  
       216 天前 via Android
    没什么太好办法,不用 -f 也就那么回事,时间长了人一旦皮条了一点辙都没有。坚持双人检查可能更有意义
    realpg
        24
    realpg  
       216 天前   ❤️ 1
    @iseki #22
    没接受过金钱的毒打的运维自然会打出/ *
    iseki
        25
    iseki  
       216 天前
    @realpg 我觉得这个还好,除非你当前在 / 下面,否则 rm -rf / 只会提示 preserved ,*也就删删当前目录,我提这个主要规避删根的···
    Jirajine
        26
    Jirajine  
       216 天前 via Android
    @realpg
    因为你这种规范要求就和这个帖子 https://www.v2ex.com/t/816040 不准用 http put 一样没什么实际意义纯粹给人制造麻烦,GNU rm 已经内置了-i 和-I 的保护措施不用。顺便-f 根本是不必要的,很多人习惯 rm -rf 的原因是有些系统会默认 alias rm='rm -i',会导致批量删除时不加-f 会让每个文件都提示从而无法正常使用。
    MrKrabs
        27
    MrKrabs  
       216 天前   ❤️ 2
    执行 rm 前要手机验证码
    dimpleok
        28
    dimpleok  
       216 天前
    可以试试这里提到的方法,https://zhuanlan.zhihu.com/p/658109345 (利用技术手段避免误删除根目录)
    ZRS
        29
    ZRS  
       216 天前 via iPhone
    做运维工具,不要手操,手操禁止高危命令
    bt7vip
        30
    bt7vip  
       216 天前 via Android
    生产环境把 rm 设置成高危命令,删文件统一将文件 MV 到/tmp 目录,删除非/tmp 下文件直接报错。
    realpg
        31
    realpg  
       216 天前   ❤️ 1
    @Jirajine #26
    良好的习惯比什么都重要

    要不干啥那么多误删库的

    下属员工习惯怎么培养的问题,我觉得我比你这种纯敲键盘没带过大运维的有经验


    @iseki #25
    说实话 我们实际生产中 大部分都是用且上级指名删整目录然后重建目录的办法

    很少有之前谁提到的什么目录带特殊权限什么的骚操作

    因为罚的太狠,随便查查操作历史就知道,干活的都很小心,各种反复确认

    2017 年时候疫情前业绩好,在沈阳这种三线城市,基本运维(有夜班,除非极特殊情况比如大割接,不加班)年底能拿 6 月薪的奖金,入职后三个月内一次险性可以不处罚,其他时候一次半月奖金填大坑聚餐,两次险性行为全年绩效奖就全没有,月薪普遍 8K 的话,你瞎鸡儿搞哪怕没严重后果,搞两次半年工资就打水漂了

    而且我之前提过,大部分场景,都是假终端,shell 操作的都是在特殊堡垒平台软件上,有二次包装,按键都是全记录分析的,这种场景是有能力拦截不正确高危操作的。

    培养习惯更重要,因为总有时候需要本地操作很多敏感数据,当时我们的业务,有些数据你操作错一次是要蹲监狱的。
    someday3
        32
    someday3  
       216 天前
    就算有 windows 类似的回收站,你信不信,还是会有大量的人误删除,把回收站清空后发现又误删除。

    无他,人的问题单纯的技术是解决不了的。

    腾讯的云备份那么多流程,结果操作员精准避开所有规定的流程,导致数据丢失。在 nb 的流程、规范和技术都阻挡不住犯蠢的人。

    操作删除和其他危险命令的时候自己警觉一点,看一下有没有敲错,目录对不对,有没有超权限,比什么技术都 nb 。
    ochatokori
        33
    ochatokori  
       216 天前 via Android
    我只会在外层用 tab 把路径补全出来,不会手写更不会进去用*
    Jirajine
        34
    Jirajine  
       216 天前 via Android   ❤️ 1
    @realpg #31 你不如干脆说只要记录审计加重罚让人小心操作就解决了。
    你提供的推荐方式是错误的,只要目录的权限和当前 umask 不同、或所有用户/组与当前登录用户不同,从上级删除并重建就一定会把权限搞乱套。更不用说 xattr 等扩展属性、或者删掉了一个 btrfs subvolume 然后重建了一个普通的目录这种会为以后埋坑的现象。除非你的服务器是单用户的不然这种情况绝对不是“很少”而是很常见。
    不要把你在特定场景的施行那一套“运维体操”当作一般建议。
    iseki
        35
    iseki  
       216 天前 via Android
    @realpg 嗯,我一般也是指明删整目录,打星号太危险了,每次涉及到通配符我都得停下来再三确认…
    我们这倒是不罚款,但是总搞出事故也不是什么好事啊…我到现在还没有一次把人家线上目录删坏过。
    不过你这样罚款它违反不违反劳动法
    realpg
        36
    realpg  
       216 天前   ❤️ 2
    @iseki #35

    罚款不是目的,目的是养成习惯。习惯就是让你习惯公司规定写死的规则,你可以不理解,你可以嫌麻烦,你可以嫌这个很傻逼;这些弱智的规定都是有原因的,都是为了让傻瓜也能少犯错误。盲目自信才是出现各种奇葩问题的本质原因,在这里就是给你打掉自己自作聪明的机会,不遵守规则,就让你肉疼到死。

    搞技术的,天生排斥管理,也不想深入学习管理,不站在管理的思维上考虑问题,这也是 35 岁危机的一个重大原因,上升空间自己给自己堵死了。

    删除这个,基本日常每周培训的重点强调就是去上级删整个目录再重建。要么还有一个在 web 控制台的文件传输系统删除的办法。

    开除以前的罚款大部分都是直接填坑进公司基金,也不上交公司,聚餐团建用,差额公司掏。只有没有绩效奖金这种是公司赚了。

    小地方,这边招的素质参差不齐,虽然日常操作都是在高层假控制台上,总有特殊情况需要你本地操作的时候,以及协同客户操作客户的机器。日常习惯就是一点点积累的。

    我们这边日常各种强调的就是多用 tab 补全,多按不犯错。vi 调配置里多按 esc 切模式等一系列基本建议,就是防止某一次出坑。

    有些区域,业务比较敏感,真的是误操作会蹲监狱的。



    至于劳动法,严格遵守。因为大老板是体制内高层领导出身,当地有头有脸,一切有法可依的地方合规做的特别好,本市在商界是不著名小企业,但是在当地政府那边是有一号的。

    运维普通员工合同工资都是 5K 多,不出重大生产安全事故到手都 8K 多,严格遵守劳动法,在职过一年社保公积金技术都按上一年实发调整到 8K 左右。扣的只有合同没有一点承诺的 12 薪+过节费以外的个人绩效奖金。这部分在入职时候也是不说的,除非你是内推别人告诉你这公司有这待遇,否则都是你呆满 1 年你才知道有这比意外之财,4 月 1 日以后入职当年没有。

    而且,这个是要连坐的,三次险性事故征候,或一次造成损失实际事故,根据损失评估,有明确标准,是团队,还是所在班次(倒班班次)、运维分公司,乃至全公司这个钱都没有。
    aelloncs
        37
    aelloncs  
       216 天前
    那不是自己业务不熟练能力不行还怪到工具上了?这种水平的还敢有管理员权限?啥公司啊?
    ulosggs
        38
    ulosggs  
       216 天前
    这个 realpg 一直强调自己的管理多么牛,怎么这么牛的管理者招过来的小弟全是菜鸡呢
    inhzus
        39
    inhzus  
       216 天前 via iPad
    alias rm mv
    dabai0806
        40
    dabai0806  
       216 天前   ❤️ 1
    https://github.com/andreafrancia/trash-cli

    brew info trash-cli
    pip install trash-cli

    alias rm='trash-put'
    alias rl='trash-list'
    alias rr='trash-restore'
    pengtdyd
        41
    pengtdyd  
       216 天前
    能问出这个问题,本身就是一个问题。
    lbm008
        42
    lbm008  
       215 天前
    lindas
        43
    lindas  
       215 天前
    我习惯先 ls 一下想删除的东西,然后再把 ls 改成 rm
    james122333
        44
    james122333  
       215 天前 via Android
    当然有 不过不讲
    james122333
        45
    james122333  
       215 天前 via Android
    @realpg

    问题是这问题不是技术无解 人都不是机器 每次都是手动 要计算机都无用 整好了没错可犯自然比出事要好
    rio
        46
    rio  
       215 天前   ❤️ 1
    主要还是操作系统发行版不给力,那么多靠谱的方案可以保护系统核心文件不受影响( macOS 下 `rm -rf` 就不会影响核心系统,Linux 原生的方案也有 btrfs snapshot 可以利用),但是没有人做 🤷
    Ocean810975
        47
    Ocean810975  
       215 天前 via Android
    在 linux 下用 pwsh 确实不会出现这样的问题
    msg7086
        48
    msg7086  
       215 天前   ❤️ 1
    要提示没有权限,可以用非特权用户。
    要给提醒,可以不加 f ,可以用 zsh 。
    要最佳实践,可以制定规则,可以写 checklist ,可以在执行危险操作之前双手离开键盘先思考 5 秒钟人生再按下回车。

    危险操作,每个行业都有。做手术的,开飞机开火车的,做化工的,造大楼的,甚至是马路上开车的。运维又不是什么特殊岗位。看看别的行业怎么避免手滑的,怎么规范操作的,照搬一下就行了。

    讲讲我自己的运维习惯。我所有的操作都是 root 账号下运行,因为我所有的操作都涉及到 root 权限,开非特权账号没有意义。首先是我用 zsh 并且把 IP ,主机名,当前目录放在提示符里,高亮分颜色显示,一眼就知道自己操作的是哪台机器,在哪个目录里操作。其次对于重要的生产机,我会在提示符里加上高亮闪烁的 PRODUCTION 字样,一眼就知道自己在操作危险环境。最后对于有副作用的操作,比如 rm ,比如升级软件包,比如重启机器等,按下回车之前脑子里先想一想自己在干什么,确认无误以后再按。

    人犯错是无解的,再多的措施无法避免。但是这些措施可以把一月一遇、一年一遇的错误操作,变成十年一遇,百年一遇。航空业那么多飞机天天飞,事故也是无法避免的,但是现在的措施可以做到概率足够小,远比坐车甚至走路安全,那就行了。
    rekord
        49
    rekord  
       215 天前 via Android
    要不做个别名,将 rm 映射到 cp ,然后是不是就变成了回收站的效果。
    huajingyu
        50
    huajingyu  
       215 天前 via Android
    我使用 Windows ,经常使用 CMD 。( CMD 比文件资源管理器快。)
    我很少使用 \ 和 . 目录,我删除文件和目录,会输入绝对路径,或是至少有一个文件名的相对路径。从来没有只删除 \ 或 . 的情况。
    比如说我要删除 Folder 这整个文件夹,如果当前目录在这个文件夹中,我会先 CD .. 到上层文件夹,然后再输入 RMDIR /S Folder 去删除。
    不过我很早以前,当前目录在用户文件夹的时候,不小心 DEL /S *.TXT 把用户文件夹下所有文本文件删了一部分,后来及时 ^C 给中断了。然后重装了一些软件。( AppData 是第一个被遍历的文件夹,所以一些配置文件被删除了。)
    gpt5
        51
    gpt5  
       215 天前
    mv
    THESDZ
        52
    THESDZ  
       215 天前
    safe-rm
    cslive
        53
    cslive  
       215 天前
    上审计,高危命令需要授权确认
    dadebucuo
        54
    dadebucuo  
       215 天前
    用 inode 精确删单个目录
    cd /xxx
    ll -i
    find /xxx -maxdepth 1 -inum $inodeNo | xargs rm -rf
    lisxour
        55
    lisxour  
       215 天前
    把 rm 换掉不就好了,系统层面基本无解,你从命令行删除文件,即使系统有回收站,大概率也只是提供给 GUI 用的,windows 也是一样,你在 cmd 删文件是不会跑到回收站的,回收站仅限于资源管理器删除。

    1. 换成更安全的兼容替代品,比如 dry run 检测到正在删除根目录或者系统目录的东西,先提示一个大大的 warning
    2. 把 rm 换成有备份的替代,基本就是 rm 换成了 mv
    standchan
        56
    standchan  
       215 天前
    别名、权限,linux 已经做的很多的,抵不上你糟糕的习惯!!!!
    2NUT
        57
    2NUT  
       215 天前
    精细化权限控制 不要使用 root 权限
    l502008310
        58
    l502008310  
       215 天前
    1 、不用-f
    2 、删前备份
    3 、禁/开头,要删哪些进入对应目录,总不至于你们把东西放在/目录下吧,规范上都不合理了。
    xFrye
        59
    xFrye  
       215 天前
    有啊,删目录之前看看自己确认下要删什么东西不行么? sudo -rf 还不知道自己要删的哪个目录,只能找神仙来救救你了
    qiyilai
        60
    qiyilai  
       215 天前
    终于知道奇怪的功能特性和需求的来源了
    llrasd
        61
    llrasd  
       215 天前
    mv 到 /tmp 目录,过几天就自己自动删除了
    pota
        62
    pota  
       215 天前
    后悔药就是不要 rm mv 就好
    suofeiya
        63
    suofeiya  
       215 天前

    来个 trash-cli 的别名吧,我本地和服务器上都设置了.
    cy18
        64
    cy18  
       215 天前
    犯错三步骤:
    1. 用 root 登陆或者无脑 sudo 。
    2. 删文件前不看当前目录或者手滑多打空格。
    3. rm -rf 。
    三个步骤都有规避方法:
    1. 不要使用 root ,加 sudo 前过脑子。
    2. 制定合适的操作规范,比如 @realpg #4
    3. 使用其他命令做 alias ,比如 @dabai0806 #40
    tomychen
        65
    tomychen  
       215 天前
    mv 到 for_delete_path/
    然后让主管来 rm (路过.jpg
    zsh2517
        66
    zsh2517  
       215 天前
    说一下我自己的情况
    1. 不 rm * 或者 ./XX (包括 ./*),为了避免键盘出问题。
    删除一个东西的时候,进到他的上一层,然后 rm 后面直接跟跟具体的文件名/目录名,而不是通配符(例外情况,*.jpg ,log-* 这种名称+通配符)

    2. rm 输入完之后,tab 确认一下(文件不存在/前缀匹配/完全匹配,shell 表现是不一样的)

    3. rm xxx; rm xxx -r; rm xxx -rf; ,默认情况 rm ,知道是目录的情况下才加 -r ,删除有问题的时候才加 -rf 。
    避免删除以为是个文件,结果是个目录的情况。以及后面输入参数的时候有机会再看一遍删除的东西对不对

    4. 重要的东西,mv xx xx.old / mv xx ~/.trash 先扔一边,确认没问题再删除
    zsh2517
        67
    zsh2517  
       215 天前
    @lindas 你这让我想起来,SQL 删改之前先 select ,select 没问题再改 update/delete
    happyxhw101
        68
    happyxhw101  
       215 天前
    用 mv 代替 rm
    Terry3366
        69
    Terry3366  
       215 天前
    @realpg #4 为什么不能进目录再 * 我都是这么操作的
    我看那个误删的帖子是 删的 /
    julyclyde
        70
    julyclyde  
       215 天前
    文责自负就挺安全的
    lindas
        71
    lindas  
       215 天前
    @zsh2517 一个思路,不可逆操作前,不看清目标就不安心
    dode
        72
    dode  
       214 天前
    搞上存储快照、数据库备份,CI/CD 部署,容器运行无状态服务
    ruifeng
        73
    ruifeng  
       212 天前
    把 rm 改成 mv 到/tmp
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2473 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 95ms · UTC 16:04 · PVG 00:04 · LAX 09:04 · JFK 12:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.