【发布时间】: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