摘要
- OpenSSH 8.7 发布说明记录了 2021 年
scp的实验性 SFTP 模式;OpenSSH 9.0在 2022 年 4 月 8 日把它设为默认传输协议。 - 9.0 发布说明明确指出:旧 SCP/RCP 借远端 shell 展开通配符,文件名常需繁琐的双重引号;
-O保留旧协议作为兼容出口。
一个文件名要过几道关
scp host:*.txt . 看似在说“把那边的文本文件拿来”。旧 SCP/RCP 模式把远端通配符交给远端用户的 shell 解释。OpenSSH 的 9.0 说明指出了副作用:文件名若包含 shell 特殊字符,命令行可能得做双重引号处理。你以为自己在写路径,远端 shell 却有机会把其中的符号当命令语法。传文件的命令把一部分语义外包给了登录环境。
这里变化的不是 SSH 是否加密。SFTP 模式仍在 SSH 连接上运行。现行 scp(1) 手册也这样描述。变化在于谁解释远端路径、谁执行通配符展开。旧协议要求远端 shell 参与;SFTP 模式让文件名处理更可预测。常见的“命令没变,所以行为没变”在这里失灵。
先试跑,再改默认
2021 年 OpenSSH 8.7先给 scp 加上实验性的 -s,让操作者试用 SFTP 传输。同一版本还改变了两台远端主机间复制的默认路线:数据经本地主机中转。说明书给出的理由是避免在来源主机暴露去往目的主机的凭据,也避免本地、来源与目的三处 shell 反复解释文件名。它不是一次把所有风险交给一句“新协议更好”,而是拆开了具体的解释路径。
2022 年 4 月 8 日发布的 9.0将 SFTP 设为 scp 默认。旧脚本却可能已经把远端 shell 的双重引号写死。新模式不需要那层引号,沿用旧写法反而可能失败。项目明确认为摆脱脆弱引号是好事,不打算在新模式里重演旧协议的怪癖。软件维护者有时必须让某些旧脚本报错,才能不把旧语法永久供奉起来。
另一类问题是 ~user/ 路径。SFTP 本身没有原生的“展开其他用户主目录”规则。OpenSSH 8.7 给服务端增加路径展开扩展来处理这类路径;9.0 说明同时提醒旧 SFTP 服务端可能没有该扩展。客户端升级并不能替远端补齐能力。
兼容出口是 scp -O。当前手册列出没有 SFTP 的旧服务器、特定通配符写法与旧服务器的波浪号展开等使用场景。代价也一起回来:旧 SCP/RCP 仍让远端 shell 参与通配符解释,需要谨慎处理特殊字符。这个参数不是神奇修补剂,而是把包裹送回旧车道。
招牌和协议各管一层
OpenBSD 7.3 的手册已经把 scp 写作经 SSH 连接使用 SFTP;现行手册说明默认值从 OpenSSH 9.0 开始。把两份发布说明与手册摆在一起,事件就很清楚:用户接口保留,默认的文件传输对话更换,旧对话作为例外保存。受影响的是脚本、文件名和服务端能力,不是命令被删除。
这也是历史里最有意思的一笔。scp 这个名字继续站在柜台前,后台却换了工序。发布者能调默认值;远端服务器和多年积累的命令行仍在投票。每一笔实际复制,才是迁移是否完成的验收。
会员简报
档案背景详情
使用相应会员等级登录,即可解锁完整简报与来源注释。
仅限战略圈层会员
战略圈层
所有读者均可浏览。加入并登录后可解锁档案简报。
加入战略圈层仅限 Leadership Alliance
Leadership Alliance
符合条件的 IP 资产所有者和管理层可登录查看 Leadership Alliance 简报。
加入 Leadership Alliance





