【问题标题】:Unable to get git-receive-pack to work with golang ssh tunneling无法让 git-receive-pack 与 golang ssh 隧道一起工作
【发布时间】:2021-02-25 12:46:55
【问题描述】:

我正在尝试通过 Golang SSH 反向代理转发 git 命令。 “git-upload-pack”和“git-receive-pack”这两个命令都有效。问题是“git-receive-pack”在文件传输后发送错误。

这是错误的屏幕截图: link

我也尝试过使用 github.com 公共存储库,结果相同。

几乎可以确定问题出在这两个功能上,但经过研究我找不到解决方案。
如果有人对原因或解决方案有任何想法,我会很高兴为您阅读。

SSH服务器连接到Git服务器的功能:

func connectToDestination(user, host string) (*ssh.Client, *ssh.Session, error) {
sshConfig := &ssh.ClientConfig{
    User:            user,
    HostKeyCallback: ssh.InsecureIgnoreHostKey(),
    Auth: []ssh.AuthMethod{
        PublicKeyFile("./keys/host_key"),
    },
}
client, err := ssh.Dial("tcp", host, sshConfig)
if err != nil {
    fmt.Println("dial return with", err)
    return nil, nil, err
}
session, err := client.NewSession()
if err != nil {
    client.Close()
    return nil, session, err
}
return nil, session, nil}

当客户端连接到 SSH 服务器时处理执行的函数:

func handleExec(ch ssh.Channel, req *ssh.Request) {
command := string(req.Payload[4:])
fmt.Println(command)
gitCmds := []string{"git-receive-pack", "git-upload-pack"}

valid := false
for _, cmd := range gitCmds {
    if strings.HasPrefix(command, cmd) {
        valid = true
    }
}
if !valid {
    ch.Write([]byte("command is not a GIT command\r\n"))
    ch.Close()
    return
}

////////////////////CODE HERE///////////////////////
// _, targetSession, err := connectToDestination("git", "localhost:2220")
// _, targetSession, err := connectToDestination("git", "github.com:22")
_, targetSession, err := connectToDestination("git", "172.18.0.3:22")

if err != nil {
    fmt.Println(err)
}

targetStderr, _ := targetSession.StderrPipe()
targetStdout, _ := targetSession.StdoutPipe()
targetStdin, _ := targetSession.StdinPipe()
wg := &sync.WaitGroup{}
wg.Add(3)

go func() {
    defer wg.Done()
    io.Copy(targetStdin, ch)
}()
go func() {
    defer wg.Done()
    io.Copy(ch.Stderr(), targetStderr)
}()
go func() {
    defer wg.Done()
    io.Copy(ch, targetStdout)
}()

targetSession.Run(string(req.Payload[4:]))
wg.Wait()

targetSession.Close()
ch.Close()}

谢谢!

【问题讨论】:

    标签: git sockets go ssh ssh-tunnel


    【解决方案1】:

    几年前在尝试在 SDN 上路由 ssh 时确实遇到了这个问题。说完就放弃了。但还是对答案很感兴趣

    【讨论】:

      猜你喜欢
      • 2012-07-30
      • 2014-10-13
      • 2018-11-16
      • 2015-08-28
      • 2017-06-01
      • 2019-04-27
      • 1970-01-01
      • 2021-12-03
      • 1970-01-01
      相关资源
      最近更新 更多