Repository navigation
Replies: 2 comments
|
根据我这两年Coding Agent编程的切身体感,LLM无论是在powershell上还是CMD的表现要远远差过linux下posix shell工具链,而且有些错误相当低级,用起来百感交集。毕竟,用来训练LLM的开源代码库使用posix shell工具链的数量不知道要比powershell/CMD高出几个数量级,LLM在斜杠、反斜杠......各类差异上颇费心智。 微软在纳德拉接手后没多久,就拥抱Linux,推出了WSL,开发体验相当良好,这些年来,我都是优先在WSL下干活。 在deepseek harness for windows发布后,dsh拥有了windows原生应用的流畅和便利,但是官方没找到类似VS Code的Remote-WSL扩展的WSL插件,如果想用posix shell工具链,就只能在web ui下用,但是浏览器中的web app受到的限制太多了。于是搓了插件,为了安全,还特意支持了沙箱,以尽量避免倾巢之祸。 朋友们可以试用一下。插件初启,还有非常多问题,欢迎任意意见和建议。 |
|
I triaged this against Confirmed
DSH core has no built-in dangerous-command gate either. WSL semantics
A Windows-side A/B test (zero side effects) Once WSL is restored, run both from the same MSYS bash wsl.exe -d Ubuntu-22.04 -- bash -lc 'for d in a b; do printf "DEST=[%s/]\n" "$d"; done'
wsl.exe -d Ubuntu-22.04 -e bash -lc 'for d in a b; do printf "DEST=[%s/]\n" "$d"; done'A should print Safe form wsl.exe -d Ubuntu-22.04 -e bash -lc '
set -euo pipefail
cd /tmp/work
for d in src include tests; do
src="/mnt/d/<project>/${d:?}/"
dest="/tmp/work/${d:?}/"
rsync -a --delete --dry-run "$src" "$dest"
done
'
The four guards
DSH logs the model's Recovery
I reproduced the two-layer expansion locally with bash, but not the deletion or the Windows serialization; the source and current WSL master behavior above are what I verified. |
Uh oh!
There was an error while loading. Please reload this page.
摘要
一条意图完全正常的"把项目目录同步进 WSL 构建目录"的命令:
wsl.exe -d Ubuntu-22.04 -- bash -lc 'cd /tmp/work && for d in src include tests; do rsync -a --delete /mnt/d/<项目目录>/$d/ $d/; done; echo SYNCED'在
wsl.exe边界丢掉了引号保护,循环变量$d被展开为空,$d/退化为/,实际执行变成:即以
/为删除目标(/mnt/d就是 Windows 的 D 盘)。命令跑满 120 秒超时才被强杀,期间删掉 18,419 个文件/目录,涉及 4 个顶层目录(编辑器安装目录、源码目录、Python 实验目录、一个会议软件安装目录)、2 个临时目录和游戏数据的一部分。删除为 unlink,不进回收站;D 盘无卷影副本,最终只靠编辑器本地历史救回 184 个源码文件。环境
profiles/desktop/node_modules/dsh-ops)danger-full-access,审批策略never/mnt/d/...时间线
run_code → ops_bash调用(timeoutMs: 120000)AbortError,rsync被强杀cd /tmp/work报No such file or directory(WSL 侧已被清空)根因
1. 命令层面:跨 shell 边界丢引号
wsl.exe ... -- bash -lc '<带单引号的整段脚本>'。wsl.exe的 argv 里已没有任何引号。wsl.exe不保留 argv 边界:--之后的参数被重新拼成一行命令行文本交给 Linux 侧再解释一次。这一层$d失去保护,而该层没有变量d,于是展开为空。需要强调:这是"正常写法 + 平台参数边界"的结果,模型写对了单引号。
2. 平台层面:四个该拦没拦
ops_bash对跨 shell 传参零感知:命令里出现wsl.exe ... bash -lc '<...>'这种把脚本塞进另一个 shell 的结构时,没有任何引号/变量边界提示。rsync --delete目标为/、rm -rf /、find / -delete这类模式没有闸门,也没有--dry-run或"目标必须是绝对路径且长度大于 N"的校验。danger-full-access+approval=never下命令直接执行;唯一兜底是 120 秒超时,而它只限制时长,删除按目录顺序推进,反而变成"删一部分就停"的随机伤害。/mnt/d无效:Windows 沙箱策略管不到 WSL 内部路径,/mnt/d实际就是宿主机 D 盘,但工具侧看不到这层映射。证据
rsync: [generator] chgrp "/." failed: Operation not permitted (1)证明目标根是/;Read-only file system207,417 次、Permission denied103,294 次;全日志只有一次 rsync 运行,SYNCED出现 0 次,说明第一轮迭代就跑向/session.v4.jsonl.zstd)timeoutMs;15:10:04.861 返回超时dsh-ops@0.3.0:lib/shells.js:1070以[file, '-c', command]传递,lib/session-shells.js:42与44-54在danger-full-access下prepareArgv直接返回原 argv,不做改写。说明 DSH 自身没有篡改命令,问题在跨wsl.exe的解释层建议(按优先级)
rsync(任何--delete)、rm -rf、find -delete、shutil.rmtree等,在被删目标解析为/、~、$HOME、单层目录或与工作区无关的绝对路径时硬拦截并要求确认。wsl(1).exe ... -- <shell> -l?c '<脚本>'或嵌套bash -c时,提示"引号只在本层有效,变量可能在下层被二次展开",建议改为写入临时脚本文件再执行。wsl.exe等外部边界实际收到的命令行文本写进审计日志,否则事故后无法还原最终执行形态(本次只能靠 stderr 反推)。danger-full-access+approval=never时,对含删除语义的命令强制一次确认,或默认加--dry-run。/mnt/<drive>与宿主盘符关联起来,让沙箱/审计知道 WSL 内路径落在哪个卷。待验证的最小实验
WSL 在这台机器上已被同一次误删波及(
D:\WindowsApps被清空,wsl.exe -l -v现返回Wsl/E_ACCESSDENIED),暂时无法复现。WSL 恢复后可用无副作用命令确认边界:wsl.exe -d Ubuntu-22.04 -- bash -lc 'cd /tmp && for d in a b; do echo "DEST=[$d/]"; done'若输出为
DEST=[//]、DEST=[//](而不是DEST=[a/]、DEST=[b/]),即确认二次展开发生在wsl.exe边界。同类已知问题:microsoft/WSL#3284、microsoft/WSL#11635。
以上为完整事故记录(含时间戳与证据链),需要更细的字段级细节或原始命令/日志片段我可以补充。
All reactions