Skip to content

2026 年了,怎么还有把“流氓软件”做进终端的 AI 工具? #87

Description

@junit

2026 年了,怎么还有把“流氓软件”做进终端的 AI 工具?

“进门只要一行 curl,出门得靠法医刑侦。”


作为一个每天和终端打交道的程序员,我们这代人其实早就被各路工具驯化得很有耐心了。

Node.js 庞大的 node_modules 吞噬硬盘?我们忍了;某个 Python 依赖因为 C 库编译失败疯狂报错?我们习惯了;甚至连某些大厂 CLI 工具动不动就要收集匿名遥测数据,大家也睁一只眼闭一只眼。

但今天在体验了某款号称“终端原生、AI 加持、重新定义开发流”的 Qoder 之后,我还是被深深地上了一课。

这一课的名字叫:哪怕时代已经快进到了 2026 年的 AI 盛世,某些团队骨子里的“流氓软件基因”,依然能借尸还魂,精准降临在你的终端里。


一、进门叫 qoder,出门没出口

所有去过 Qoder 官网或看过宣传的开发者,脑子里只被灌输了一件事:

安装极其极客,只要一行命令:

curl -fsSL https://qoder.com/install | bash

安装完,官方文档赫然写着:“在终端输入 qoder,开启智能编程之旅。”

没有额外的复杂参数,命令就叫 qoder。简洁、好记、逼格拉满。

我试用了两分钟,感觉并不契合我的日常工作流,于是打算像对待任何一个成熟的命令行工具一样把它清理掉。

我本能地在终端敲下:

qoder uninstall

全场最魔幻、最荒诞的一幕上演了。

终端没有弹出“您确定要卸载吗?”,也没有报错提示“未知命令”——只见屏幕微微一闪,qoder 原生终端界面大摇大摆地启动了。

光标闪烁,AI 大模型在终端里毕恭毕敬地给我吐出一行字:

“收到。请问您是想为当前项目编写卸载脚本,还是想帮您分析并卸载某个 npm / pip 依赖?”

——合着在它的字典里,根本就没有卸载这回事!

由于官方那个分发脚本(Dispatcher)只认它预设的几个特定指令,当你敲下 qoder uninstall 时,它发现当前目录下没有一个叫 uninstall 的文件,于是大手一挥:“明白了,用户这是在向我提问呢,Prompt 是 uninstall!”

那一瞬间,我坐在屏幕前哭笑不得:
我想杀的是你,你却热情洋溢地问我想拿这把刀切什么菜。


二、翻遍全网,查无此门

我以为是我姿势不对。也许它像某些工具一样,有个 qoder --uninstall 或者专门的卸载说明?

于是我打开官方文档:

  • 如何在终端里聊天:写了三页;
  • 如何用它的 SDK 编排多 Agent:代码密密麻麻;
  • 如何配置模型、如何买 Token、如何配企业版:入口极其醒目。

全局 Ctrl + F 搜索 uninstall、卸载、清除。
匹配结果:0 条

再带着一丝侥幸,去浏览器访问 qoder.com/uninstall。
HTTP 404 Not Found

那一刻我彻底顿悟了:在这个产品的生命周期字典里,从第一天起,就只有“激活”与“拉新”,压根就没给“离开”留过任何一具棺材。


三、终端里的“刑侦现场”:它到底瞒着你动了多少东西?

本着程序员刨根问底的本能,我打开了系统监控和 Shell 配置,顺藤摸瓜看看它到底在我的电脑里塞了什么。

这一查,堪比一场微缩版的“法医现场取证”:

1. 家目录下悄悄安家

它在你的用户家目录下静默创建了 ~/.qoder(如果你不小心试过国内版,还会多出一个 ~/.qoder-cn),里面塞满了各个版本的运行时、扩展、日志以及内部用的二进制文件。

2. “三管齐下”的 Shell 配置文件污染

最绝的还在后头。为了确保你在任何地方敲 qoder 都能精准命中,它的安装器对程序员的配置文件表现出了惊人的执念:

  • 它不仅改了你的 ~/.zshrc;
  • 还顺手把用于登录 Shell 的 ~/.zprofile 给改了;
  • 甚至连理论上只应该放环境配置、最忌讳被外来工具污染的 ~/.zshenv,也被它强行插了一脚!

每个文件的末尾,都整整齐齐地被强行注入了这样一段“牛皮癣”:

# QODER_DISPATCHER_PATH v1
path=("$HOME/.qoder/entry" ${path:#"$HOME/.qoder/entry"})
# END QODER_DISPATCHER_PATH v1

如果你国内版、国际版都试过,那就是双倍快乐——三个文件被写入了六段配置。

更讽刺的是,在它的安装目录里,还安详地躺着一个叫 .rc-written-sentinel 的 JSON 记录文件。它清清楚楚地记录着自己在什么时间、成功污染了你哪几个配置文件。

作案现场它自己记得比谁都清楚,但它偏偏就是舍不得给你写一行用来还原现场的代码。


四、写个卸载逻辑,到底触犯了谁的利益?

写一个干净的卸载脚本,对一个开发代码大模型的顶尖技术团队来说,到底有多难?

无非就是:

  1. 删掉 ~/.qoder(和 ~/.qoder-cn);
  2. 删掉 ~/.local/bin 里对应的软链接;
  3. 用 sed 遍历清理掉那几个 rc 文件里的标记代码块。

总共不到十行 Shell 代码。

哪怕让 Qoder 自己的大模型来写,从构思到生成代码,耗时也不会超过 3 秒钟。

但为什么不做?

在古老的 PC 互联网时代,我们早就见识过这套恶心的戏码:软件装上容易,卸载按钮要放在四级子菜单的最深处;点击卸载弹三次“您真的要离开我吗?”的流泪卡通头像;即便你点了确定,还在你的系统服务和注册表里留下一堆清不掉的守护进程。

我们原以为,面向程序员、面向开源极客的开发者工具领域,大家多多少少会讲一点职业体面。

但 Qoder 结结实实地给我们提了个醒:只要产品经理的 KPI 里只考核“新增安装数”和“次月装机留存”,那不管套上了多么时髦的 AI 外壳,那种“把门焊死强撑 DAU”的恶臭基因,就永远会在程序员的终端里借壳上市。

在他们眼里:

“只要我不做卸载功能,你就是我报表里永远‘留存’的活跃工程师。”


五、请把体面还给终端

终端是程序员最后的一块自留地。

我们在终端里追求确定性,追求轻量,追求“挥一挥衣袖不带走一片云彩”的掌控感。我们之所以热爱命令行,就是因为这里曾经没有全家桶,没有流氓捆绑,我能清楚地知道每个工具在干什么,我也能随时体面、干净地请它出去。

如果一个号称引领未来软件工程的 AI 编程助手,连最基本的退出机制都要靠用户自己提着放大镜查杀目录、手动写正则清洗配置文件,那无论你在发布会上吹得多么天花乱坠:

一个连体面告别都不敢给的工具,谁敢把生产环境的核心代码,交到你的手里?


附录:被绑架用户的“自救指南”

如果你也在终端里找不到离开 Qoder 的门,请直接复制这几行真正的“卸载脚本”:

# 1. 彻底清除程序目录与残留软链接
rm -rf ~/.qoder ~/.qoder-cn
rm -f ~/.local/bin/qoder ~/.local/bin/qodercli ~/.local/bin/qoderclicn

# 2. 彻底清洗被它污染的 Shell 配置文件
for f in ~/.zshrc ~/.zprofile ~/.zshenv ~/.bashrc ~/.bash_profile ~/.profile; do
  [ -f "$f" ] && sed -i '' '/# QODER.*_DISPATCHER_PATH v1/,/# END QODER.*_DISPATCHER_PATH v1/d' "$f" 2>/dev/null
done

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions