由于 SSH 在容器内运行,因此,如果需要 SSH 支持,则需要将 SSH 从主机传递到容器。一种选择是在非标准端口上运行容器 SSH(或将主机端口移至非标准端口)。另一个可能更直接的选择是将 SSH 连接从主机转发到容器。下面将说明此设置。

配置端口转发

.ssh/config 文件中定义的 HostHostNamePort 等参数与服务器的实际配置匹配,例如:

Host git.example.top # 必须完全匹配你的域名
    HostName git.example.top
    Port 222
    User git
    IdentityFile ~/.ssh/id_rsa

Tip

id_rsa一般用于ssh免密登录,我们也可以复用github配置ssh免密时生成的密钥,一般名为id_edxxx,可自行在~/.ssh目录下查看,此外注意这里 IdentityFile配置的是私钥,而在github或gitea设置里配置的是公钥

如果未配置 .ssh/config,可以直接使用完整格式测试:

Tip

在SSH协议中,ssh://前缀是可选的。GitHub和Gitea的处理方式不同是因为:

  • GitHub的SSH地址格式是简写形式,Git能自动识别为SSH协议
  • Gitea在某些配置下(特别是非标准端口时)需要明确协议类型
git clone ssh://git@<服务器IP地址或域名>:<Gitea的SSH端口号>/jdysya/repository.git.git

通过以下命令测试是否能够连接上服务器

ssh -T git@git.example.top

若Host设置为其他别名

例如将Host设置为git

Host git  # 自定义别名
    HostName git.example.top
    Port 222
    User git

此时我们执行

git clone git:jdysya/repository.git

实际流程如下:

  1. Git 自动补全
    Git 会将简写地址补全为完整 SSH 格式:

    git:xxx → ssh://git@git:xxx
    
  2. SSH 配置匹配
    SSH 发现访问的是 Host git,于是:

    • 将目标地址替换为 git.example.top:222

    • 自动附加用户 git

    • 最终实际连接:

      ssh://git@git.example.top:222/jdysya/repository.git
      

关键原理

  • Host git 中的 git 是一个本地占位符,与真实域名无关
  • 这种写法本质是用别名替代了完整地址,类似 Shell 的别名功能
  • 要求:
    • 必须保持 User git(Gitea/GitHub 的强制要求)
    • 必须确保别名不会和真实命令冲突(如避免用 ssh 等系统关键字)

参考链接