登录
首页 >  Golang >  Go问答

无法让 git-receive-pack 与 golang ssh 隧道一起使用

来源:stackoverflow

时间:2024-02-21 12:18:25 397浏览 收藏

在Golang实战开发的过程中,我们经常会遇到一些这样那样的问题,然后要卡好半天,等问题解决了才发现原来一些细节知识点还是没有掌握好。今天golang学习网就整理分享《无法让 git-receive-pack 与 golang ssh 隧道一起使用》,聊聊,希望可以帮助到正在努力赚钱的你。

问题内容

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

这是错误的屏幕截图: 链接

我也尝试过使用 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()}

谢谢!


解决方案


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

今天关于《无法让 git-receive-pack 与 golang ssh 隧道一起使用》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>