gerrit 使用scp 获取 git hooks失败,报错:subsystem request failed on channel 0
问题背景
用户在 Raspberry Pi 上通过 scp命令 从 Gerrit 服务器复制 commit-msg 钩子文件时失败,报错 subsystem request failed on channel 0;但另一台机器使用相同命令可成功复制。
scp 命令:
scp -v -p -P 29418 xxx@<host>:hooks/commit-msg "<REPOSITORY_NAME>/.git/hooks/"
排查步骤
1. 分析错误日志
Raspberry Pi 的 scp 日志显示:Executing: ... command sftp,且最终报错 subsystem request failed,说明其尝试使用 sftp 子系统,但服务器拒绝。
2. 对比成功机器的日志
成功机器的日志显示:Executing: ... command scp -v -p -f hooks/commit-msg,说明其使用传统 scp 协议(通过 SSH 执行 scp 子命令),服务器接受该请求。
3. 确认协议差异原因
新版 OpenSSH(8.0+)为提升安全性,将 scp 默认传输方式从传统 scp 协议改为 sftp 协议,而 Gerrit 服务器(GerritCodeReview_3.2.2)仅支持传统 scp 协议的特定操作,不支持 sftp。
核心原因
两台机器的 scp 命令因 OpenSSH 版本不同,默认使用的传输协议存在差异,导致与 Gerrit 服务器的兼容性不同:
  - 新版 OpenSSH(Raspberry Pi 上的 OpenSSH_9.2p1)默认使用 sftp 协议传输文件,而 Gerrit 服务器禁用了 sftp 子系统,导致失败。
  - 旧版 OpenSSH(hf-d-003357b 上的 OpenSSH_7.6p1)默认使用传统 scp 协议,Gerrit 服务器支持该协议的特定操作(如获取钩子文件),因此成功。
解决办法
在 Raspberry Pi 上使用 scp 命令时,添加 -O 选项(强制使用传统 scp 协议):
bash
scp -O -p -P 29418 xxx@<host>:hooks/commit-msg "<REPOSITORY_NAME>/.git/hooks/"
-O 选项作用:绕过默认的 sftp 协议,强制使用原始 scp 协议(与旧版 OpenSSH 行为一致),适配 Gerrit 服务器的支持范围。
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号