V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
83f420984
V2EX  ›  程序员

AI 生成的清理 USB 设备脚本导致硬盘数据丢失的教训

  •  5
     
  •   83f420984 · 31 天前 via iPhone · 6316 次点击
    刚刚指挥 AI 帮我写一个清理挂载 usb 设备的 linux 脚本,执行完脚本发现日志不对劲,直接把我硬盘给清空了
    第 1 条附言  ·  30 天前

    本意是想让AI优化 cleanup_mounts 函数。

    img

    最终给的代码结果是:

    cleanup_mounts() {
        log "开始清理挂载点..."
        
        # 确保 MOUNT_BASE 存在且非空
        if [ -z "$MOUNT_BASE" ] || [ "$MOUNT_BASE" = "/" ]; then
            log "错误:挂载基础目录未定义或无效"
            return 1
        }
    
        local mounted_usb=$(findmnt -n -t fuseblk,vfat,ntfs,exfat,ext4 -o TARGET | grep "^$MOUNT_BASE/")
        
        if [ -z "$mounted_usb" ]; then
            log "没有找到需要清理的挂载点"
        else
            for mount_point in $mounted_usb; do
                log "正在处理挂载点: $mount_point"
                
                # 先尝试安全卸载
                if umount -l "$mount_point" 2>/dev/null; then
                    log "成功安全卸载 $mount_point"
                    continue
                fi
                
                local using_pids=$(fuser -m "$mount_point" 2>/dev/null)
                if [ -n "$using_pids" ]; then
                    log "发现正在使用此挂载点的进程: $using_pids"
                    log "正在终止这些进程..."
                    
                    # 先发送 SIGTERM 信号
                    fuser -k -TERM -m "$mount_point" >/dev/null 2>&1
                    sleep 2
                
                    if fuser -m "$mount_point" >/dev/null 2>&1; then
                        log "使用 SIGKILL 强制终止进程"
                        fuser -k -KILL -m "$mount_point" >/dev/null 2>&1
                        sleep 1
                    fi
                fi
                
                # 最后尝试强制卸载
                if umount -f "$mount_point" 2>/dev/null; then
                    log "成功强制卸载 $mount_point"
                else
                    log "警告:无法卸载 $mount_point"
                fi
            done
        fi
        
        # 清理所有遗留的挂载点目录
        find "$MOUNT_BASE" -mindepth 1 -maxdepth 1 -type d -exec rm -rf {} \;
        
        # 重建并设置正确的权限
        mkdir -p "$MOUNT_BASE"
        chmod 777 "$MOUNT_BASE"
        chown "$SMB_USER:$SMB_GROUP" "$MOUNT_BASE"
        
        # 重启 Samba 服务以确保共享正常
        systemctl restart smbd nmbd
        
    }
    
    第 2 条附言  ·  30 天前
    执行脚本后反馈的日志:

    ```bash
    root@armbian:~# sudo /usr/local/bin/usb-mount.sh cleanup
    开始清理挂载点...
    没有找到需要清理的挂载点
    清理遗留目录...
    rm: cannot remove '/mnt/usb/0005C423000F6D5D/Apps/iOS': Directory not empty
    rm: cannot remove '/mnt/usb/0005C423000F6D5D/Books': Directory not empty
    rm: cannot remove '/mnt/usb/0005C423000F6D5D/Movies/Assassination.2015.BluRay.iPad.1080p.AAC.x264-LHD': Directory not empty
    重建挂载基础目录...
    重启 Samba 服务...
    清理操作完成
    ```
    68 条回复    2024-11-19 13:14:30 +08:00
    Xu3Xan89YsA7oP64
        1
    Xu3Xan89YsA7oP64  
       31 天前   ❤️ 1
    论测试的重要性
    wukongkong
        2
    wukongkong  
       31 天前 via Android   ❤️ 2
    笑死了
    COW
        3
    COW  
       31 天前 via Android
    哈哈,是你提问的方式不对,还是 AI 被污染了
    szdosar
        4
    szdosar  
       31 天前
    自己手动,显示隐藏设备,手动删除灰色的设备项。
    msg7086
        5
    msg7086  
       31 天前   ❤️ 1
    拿到脚本不检查内容直接运行是这样的。
    cybort
        6
    cybort  
       31 天前 via Android   ❤️ 7
    你如果直接在论坛找人要脚本,结果也是这样。
    MFWT
        7
    MFWT  
       31 天前   ❤️ 1
    请谨慎使用代码 —— 来自 Gemini 的提醒
    MossFox
        8
    MossFox  
       31 天前   ❤️ 5
    "清理挂载 usb 设备的 linux 脚本"

    你就说清没清理吧 🤪
    NoOneNoBody
        9
    NoOneNoBody  
       31 天前   ❤️ 5
    对 AI 用词要准确
    要么用“移除没有挂载的”,要么用“整理”,“清理”是多涵义的
    不久前曾说过,“自从用了 AI ,就知道语文的重要性了”,V 友答:“英语也是”
    ferock
        10
    ferock  
       31 天前
    真把 AI 当懒人良药了???

    AI 只是一个怎么逗你开心怎么说话的策略工具而已。。。
    现在把 AI 当谷歌,当一言九鼎,这已经是歪楼了。

    还是懒作怪啊,更不需要自己担责,怎么也不想一下是自己敲的回车
    sampeng
        11
    sampeng  
       31 天前   ❤️ 1
    测试不是让你生成了直接就运行。。是把命令改成 print 。。确定没问题再改成真实命令。。。
    flyqie
        12
    flyqie  
       31 天前 via Android
    不意外,ai 很多时候写的是非常离谱的,自己不检查那肯定要吃亏的。
    jackchenli
        13
    jackchenli  
       31 天前
    我觉得这个例子给当今职场拿着 ai 结果当论据的人一个典范
    VZEXEZVzzz
        14
    VZEXEZVzzz  
       31 天前 via iPhone
    要不分享一下脚本看看👀
    ano
        15
    ano  
       30 天前
    太相信 Ai 了吧
    EZ4ZZW
        16
    EZ4ZZW  
       30 天前
    我猜是清理文件系统、块设备格式化之类的命令,直接怼到了系统盘上,然后还加了 `sudo`。
    yolee599
        17
    yolee599  
       30 天前 via Android
    笑死,竟然真的有人完全相信 AI ,AI 就是一个生成系统,说白了就是字符串随机拼接,完全没有验证过的
    yaoppp
        18
    yaoppp  
       30 天前
    所以楼主是如何提问的? AI 是怎么回答的?
    charlie21
        19
    charlie21  
       30 天前   ❤️ 1
    AI 出错之后谁负责和 AI 本身准确度是两个问题
    当前 AI 公司都是免责型服务,你随便用,用了后果自负 /t/1082532

    —— 也就是说,你可以调教 AI 让它对你更好用,其实用户本身成了一个免费调试员。对于这部分工作量,你的调教实际上贡献到 bot 更智能了,所以理论上 OpenAI 应该付钱给你 / 至少弥补一下你的损失
    cuicuiv5
        20
    cuicuiv5  
       30 天前   ❤️ 2
    生成完你再让他解释一下脚本
    83f420984
        21
    83f420984  
    OP
       30 天前
    @COW
    @MossFox
    @VZEXEZVzzz
    @EZ4ZZW
    @yaoppp

    如何提问和 AI 给出的代码已经发上来了
    importmeta
        22
    importmeta  
       30 天前   ❤️ 1
    这段时间在写一个平台, 深刻体会到 AI 根本不是万能的, 也代替不了人, 写个函数还行, 写个大点的功能就不行了.
    yanqiyu
        23
    yanqiyu  
       30 天前   ❤️ 1
    所以 AI 很容易搞出这种似是而非的代码,不过我吃过最大的亏就是似是而非的代码导致长达半小时的 debug 。

    不过要是想要清理挂载点盖住的文件,完全可以考虑先 unshare -m ,然后把挂载点卸了(这时候就不用考虑卸载不掉的那种情况了),然后删除文件就行了。
    Cu635
        24
    Cu635  
       30 天前
    该,谁让 op 不检查代码的?
    yanqiyu
        25
    yanqiyu  
       30 天前
    @EZ4ZZW 可能出问题的地方太多了,比如直接上来就有 findmnt 来找挂载点,但是 findmnt 输出是带树状结构的,然后 grep 的结果直接就 for-loop ,这样子要是路径有空格也会出问题

    然后前前后后就导致该卸载的卸载点没卸载掉,然后就把盘里面的文件干掉了
    julyclyde
        26
    julyclyde  
       30 天前
    太赞了
    HUZHUANGZHUANG
        27
    HUZHUANGZHUANG  
       30 天前
    用靠谱一点的,看不出来你这是哪家的,一般 claude 3.5 和 GPT 的最新模型,一般没这类问题。最重要的是你要懂代码啦
    HUZHUANGZHUANG
        28
    HUZHUANGZHUANG  
       30 天前
    @HUZHUANGZHUANG #27 另外就是我会用一个 AI 的结果到另一个 AI 那里去验证和询问。
    ochatokori
        29
    ochatokori  
       30 天前 via Android
    是这样的,和楼主无关,每次看到有人说 ai 取代程序员的我都心想但凡能看懂一点代码都说不出这话
    83f420984
        30
    83f420984  
    OP
       30 天前
    @HUZHUANGZHUANG cursor 里选择的是 claude-3.5-sonnet
    zhangeric
        31
    zhangeric  
       30 天前
    ai 给的代码一定要测试啊.
    spadger
        32
    spadger  
       30 天前
    哈哈哈哈
    leaflxh
        33
    leaflxh  
       30 天前
    哪天逃逸了都不奇怪

    rm -rf 属于高危操作
    zhujinliang
        34
    zhujinliang  
       30 天前 via iPhone   ❤️ 10
    AI 自撰一良方 服之 卒
    mingtdlb
        35
    mingtdlb  
       30 天前   ❤️ 1
    人家给你代码,你都不审计一下吗?
    sn0wdr1am
        36
    sn0wdr1am  
       30 天前   ❤️ 1
    以后直接用 AI 看病,后果可想而知。

    能直接把人给看没了。
    sn0wdr1am
        37
    sn0wdr1am  
       30 天前   ❤️ 1
    不要过度信任 AI ,就像不要把辅助驾驶功能当作无人驾驶功能一样。
    oldcai
        38
    oldcai  
       30 天前
    是哪个 AI 来着
    83f420984
        39
    83f420984  
    OP
       30 天前
    @oldcai cursor 里选择的是 claude-3.5-sonnet ,但不确定额度用完后会不会降级成其它
    javaisthebest
        40
    javaisthebest  
       30 天前
    那玩意和搜索引擎有啥本质区别?

    搜索引擎答案是什么 ai 答案是什么

    你用 ai 背后说不定非洲一大群黑叔叔正在做数据标注给你筛选答案呢
    liulicaixiao
        41
    liulicaixiao  
       30 天前
    删东西的脚本你也敢乱用哈哈,我上次让 claude 写个自动更换代理的脚本我都是自己看完一遍代码才敢用
    enihcam
        42
    enihcam  
       30 天前
    想起一个巨 sb 的同事。

    我:这个代码测了没?
    他:这个代码是 AI 生成。

    我:那,这个代码测了没?
    他:这个代码是 AI 生成。

    我:我知道,我是问这个代码测了没?
    他:这个代码是 AI 生成。
    512357301
        43
    512357301  
       30 天前 via Android
    AI 是干脏活儿、累活儿的,不是干新活儿的。
    提线木偶知道吧,AI 现阶段只能当提线木偶来用,还没法让它独立干活儿,太不可控了。。。
    它就好像是你的一个高能下属,干活儿很快,80%的效果都不错,但你不盯着它,它就可能搞砸事情。。。
    它的某些能力确实很牛逼,但你控制不了它,它就会“作恶”,虽然它只是在执行你的命令而已。
    推荐看一篇短篇漫画,《神秘的程序员们系列——代码的深渊》,讲的就是 AI 的故事。
    BeforeTooLate
        44
    BeforeTooLate  
       30 天前
    建议用英语去提问,中文很多词表达意思不够精确
    wnpllrzodiac
        45
    wnpllrzodiac  
       30 天前
    rm -rf ${variable}/

    这种脚本么。变量一空就废了
    yhm2046
        46
    yhm2046  
       30 天前
    楼上好多人没用过 cursor 把,截图最下方写了模型是 claude3.5-connect ,我原来也用了一段时间最近发现不能白嫖,昨天看到马斯克的 gork2 更新了,免费每个月 25 美元的 api ,用 ai 写了下载网上视频的 python 程序,感觉比 chatgpt 和 claude3 好用,不过用了一个多小时又报错不能用了:遇到了来自 Custom Provider 的错误,一般是由错误设置或账户问题引起的。请检查 AI 设置和账户情况,或者点击这里查看常见问题文档。API Error: Status Code 400, {"code":"Client specified an invalid argument","error":"The model expects a single `text` element per message."}

    有知道的指点一下谢谢
    plmsuper8
        47
    plmsuper8  
       30 天前
    gpt4 给的建议是:

    这段脚本的核心逻辑看起来非常周全,。。。不过,还有一些地方可以优化和加强健壮性:改进建议:
    。。。

    安全性检查:
    避免误删除非挂载点文件:

    ```bash
    find "$MOUNT_BASE" -mindepth 1 -maxdepth 1 -type d -exec test -z "$(findmnt -n -o TARGET -- "{}")" \; -exec rm -rf {} +
    ```
    plmsuper8
        48
    plmsuper8  
       30 天前
    @javaisthebest 区别是,搜索引擎的东西大多还是能用的(被 ai 污染前),毕竟试过才会贴上来。

    但是看 ai 领域现在的激进程度,好日子还在后头呢
    poorcai
        49
    poorcai  
       30 天前
    cursor 这么拉的吗?
    nenseso
        50
    nenseso  
       30 天前
    有点可怕
    lyxxxh2
        51
    lyxxxh2  
       30 天前
    @enihcam
    可能他认为
    出了问题,可以推给 ai 。
    fyxtc
        52
    fyxtc  
       30 天前   ❤️ 1
    写 ui 用 ai 无脑上没啥问题,功能性的自己都不看真怪不了 ai ,尤其是系统级脚本,ai 也是一个自动化工具,也会出错,cursor 我就在用,非常好用,目前就是编程 ai 的天花板。但是涉及到 sh 脚本我是必然一行一行看过去的
    yankebupt
        53
    yankebupt  
       30 天前   ❤️ 1
    rm -rf 出过多少事了。Nvidia 的驱动事件还记得么……应该加个 system prompt....AI 给出的代码 rf 禁止带 f……
    openmynet
        54
    openmynet  
       30 天前
    AI 本身就是欺软怕硬。
    zy5a59
        55
    zy5a59  
       30 天前   ❤️ 1
    AI 给的代码是真得测试的,尤其是这种涉及到重要数据的
    laminux29
        56
    laminux29  
       30 天前   ❤️ 1
    普及一下写 AI 的正确姿势:

    1.不要用 Cursor 、Copilot 这种大规模协作的 AI ,因为商业化的 AI ,会考虑成本,会限制每个会话的运算空间与运算时间,运算空间为会话用到的临时硬盘空间、显存与内存。你让它执行整个 APP 或 Project 规模的,因为运算空间与时间不变,输入规模越大,会导致精度越差。建议使用最新的 gpt-o1 ,让它输出函数级别(方法级),能提高精度。而且 gpt-o1 能输出思考的过程,你能根据它的思考过程,来判断当前 AI 的思路是否靠谱。

    2.不要用中文去问,必须用英文。因为训练数据都是英文的,你用中文,它会内部翻译一次,翻译时不一定准确。
    Skifary
        57
    Skifary  
       30 天前   ❤️ 3
    AI 无法帮助一个不会的人工作,只能帮助一个已经会的人提高效率。

    这句话只有用过的吃过亏的人才理解,但是有些利益相关方鼓吹 AI ,贩卖焦虑,卖课真是恶心至极
    nyxsonsleep
        58
    nyxsonsleep  
       30 天前
    你和高速 AI 开车一样牛
    yulgang
        59
    yulgang  
       30 天前
    清理。。。
    DingJZ
        60
    DingJZ  
       30 天前
    我都让 ai 加 dry run 参数
    busier
        61
    busier  
       30 天前
    删除挂载点空目录因该用 rmdir ,你要用 rm -rf 死的不冤!
    spike0100
        62
    spike0100  
       30 天前
    只有你真的敢这么用。
    justdoit123
        63
    justdoit123  
       30 天前
    甲:这个数是 mod 3 = 1 吗?
    乙:是的。
    甲:ipython3 -> xxx % 3 -> 2 。这不等于 1 啊!
    乙:怎么可能?你是不是算错了!
    甲:你怎么算的?
    乙:ChatGPT 算的。
    甲:...............................................
    z5e56
        64
    z5e56  
       30 天前 via Android
    ai 给的代码我都会叫它再给出测试代码,审一遍再跑一遍
    julyclyde
        65
    julyclyde  
       29 天前
    @z5e56 你确认它的测试代码是另外独立写出来的,而不是根据现有待测代码派生的?
    MrKrabs
        66
    MrKrabs  
       29 天前
    人写的 bash 都不敢信还信 AI 啊
    qiuhang
        67
    qiuhang  
       29 天前
    这个 rm -rf 就很灵性啊
    Cu635
        68
    Cu635  
       29 天前
    可能不太严谨,但总感觉跟 op 提出的话题是相关的:

    /t/1090040
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5489 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 06:02 · PVG 14:02 · LAX 22:02 · JFK 01:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.