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 服务器的支持范围。

posted @ 2025-10-23 15:14  lay-zon  阅读(5)  评论(0)    收藏  举报