我试图找到一种通过ssh tunneling
连接到服务器并下载文件的方法。但无论我怎么尝试,都无法使其工作。
我在Windows10
上运行这段代码
下面是我使用的代码:
package main
import (
"fmt"
"io"
"io/ioutil"
"net"
"os"
"strconv"
"github.com/sgreben/sshtunnel"
"golang.org/x/crypto/ssh"
)
func main() {
keyPath := "sshtest2_private.pem"
authConfig := sshtunnel.ConfigAuth{
Keys: []sshtunnel.KeySource{{Path: &keyPath}},
}
sshAuthMethods, _ := authConfig.Methods()
clientConfig := ssh.ClientConfig{
User: "some_user",
Auth: sshAuthMethods,
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
}
tunnelConfig := sshtunnel.Config{
SSHAddr: "xx.xxx.xxx.xx:22",
SSHClient: &clientConfig,
}
conn, _, err := sshtunnel.Dial("tcp", "zzz.zzz.zzz.zzz:22", &tunnelConfig)
if err != nil {
panic(err)
}
fmt.Fprintln(conn, "GET /")
io.Copy(os.Stdout, conn)
}
当我尝试连接时,我收到以下错误:
panic: ssh: handshake failed: ssh: unable to authenticate, attempted methods [none publickey], no supported methods remain
对于身份验证,我使用sshtest2_private.pem文件,它与我的main.go位于同一目录中,看起来如下所示:
-----BEGIN RSA PRIVATE KEY-----
the content of my key
-----END RSA PRIVATE KEY-----
不知道为什么它会抱怨公钥问题,也不知道怎么解决这个问题。我做错了什么?
1条答案
按热度按时间nimxete21#
SSH服务器仅允许对
$HOME/.ssh/authorized_keys
中列出的那些密钥进行公钥身份验证1.为
sshtest2_private.pem
创建公钥此命令将公钥输出到stdout。
1.将此公钥附加到
xx.xxx.xxx.xx:22
,文件/home/some_user/.ssh/authorized_keys
如果文件不存在,请创建它。访问权限必须为用户专用(chmod 600 /home/some_user/.ssh/authorized_keys
)我测试过了,它能用。
顺便说一句。你的隧道的端点是
zzz.zzz.zzz.zzz:22
,但你把它用于GET /
。看起来它的端口应该是:80
,而不是:22
。