Skip to content

Z-SSH v0.2.4

Choose a tag to compare

@github-actions github-actions released this 22 Oct 09:27
· 67 commits to main since this release

修复

  • 安全:「只读自动」不再放行能写文件、改系统的写法:以前只读自动模式靠「列出已知的危险选项」判断,GNU 命令允许把长选项缩写(sort --out=文件 就是 --output)、短选项可以直接带值(date -s2020-01-01 是改系统时间)、子命令也能缩写(ip l s dev eth0 down 就是 ip link set),hostname --file=… 则是从文件设主机名,这些写法会被当成只读直接执行。现在反过来:对有参数筛选的命令(sort、uniq、rg、tree、file、ss、blkid、lastlog、dmesg、journalctl、date、hostname、ip、systemctl 等)只放行明确列出的只读选项,长选项必须写全,不认识的参数、缩写、合并写法里没列出的字母一律要你确认;ip 只放行对象加缺省命令或完整的 show/list/ls。选项的值冒充子命令(如 systemctl -p show restart x、docker --config ps rm x)、echo x >/dev/null.log 这类写到名字相近文件的重定向也一并堵上。参数里带 $变量、$'…'、花括号、通配符这类要 shell 展开后才知道真实内容的写法(sort $'\x2do' out、sort {-o,out} in 展开后就是 sort -o),以及历史展开 !(!!、!$ 会在解析前拼入以前的命令)、printf -v 改 shell 变量,也一律要你确认;cat /var/log/*.log、ls $HOME 这类不看参数的命令和写在引号里的 '*.log' 不受影响。常见的只读用法(sort -k2 file、date +%F、hostname -I、ip a、ip -br link 等)照常自动执行。
  • AI 读文件时目标被移出对话,不会再继续读:list_dir、stat、read_file 以前在等连接期间如果这台服务器被移出对话(或用户点了停止),请求仍会连上去读并把内容交给智能体;写文件和执行命令早就有这道核对。现在三个读工具在连接返回后、读之前,以及读完、返回内容之前各核对一次,已被移出的直接拒绝;移出后又加回同一台服务器,旧请求也不会重新变有效。
  • SFTP 传输出错时不再漏关远端文件句柄:以前目标文件打不开、批量读取出错、写后 fsync 失败时,已经打开的源 / 目标句柄不会发关闭请求,句柄一直占在复用的 SFTP 通道上,反复失败可能耗尽服务器允许的句柄数。现在拿到第一个句柄之后,完成、暂停、取消、读错、写错、目标打开失败、fsync 失败都会统一收尾并尽力关掉已经打开的句柄;返回的仍是最先发生的错误,关闭失败不会盖掉它,出错后截回已确认前缀、删临时文件的续传逻辑不变。
  • 编辑器「重新载入」期间输入的字不会再被吞掉:以前本地文件保存冲突时点「重新载入」(或远端冲突后放弃本地修改),等待读回内容的这段时间里编辑器仍可输入,结果回来后新输入被整个覆盖,还被标成已保存,关标签时也不再提示。现在载入期间编辑器临时只读(状态栏显示「正在重新载入…」,保存按钮暂不可用),载入完成或失败后恢复;发起时记下文档版本,结果回来时版本已变就不覆盖,保留你的文字和未保存标记并提示「重新载入期间内容有改动,没有覆盖」;载入失败保留原文。新内容、编码换行和未保存标记在同一次状态变化里更新。
  • 服务器拒绝打开终端时不再显示「已连接」:以前开终端时发出分配终端(PTY)和 shell 的请求后不等服务器回复,服务器拒绝了界面也照样显示已连接。现在会等回复:shell 被拒会直接提示「服务器拒绝打开 shell」并回到断开状态;服务器在这一步关闭连接或 20 秒没回复,也会给出明确原因。分屏复制走同一条路,一并生效。等待期间关掉窗格会关闭这条通道,服务器在回复前发送过多数据或消息会断开。
  • 服务器不给分配终端(PTY)时以无终端模式继续:git 托管账号、authorized_keys 里写了 no-pty 的账号会拒绝 PTY;现在不再当成连接失败,终端最前面会显示一行提示,然后照常打开 shell,服务器随后发来的说明文字也能看到。
  • 断线后迟到的输出不再记到重连后的新会话:断线之后、重连之前才从旧连接送到的输出仍会正常显示,但不会再被当成新会话的输出回报确认。