Подключиться к SFTP-серверу с помощью открытого ключа OpenSSH [дубликат]

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

5
задан hey 26 June 2014 в 21:37
поделиться

2 ответа

Вам нужно использовать ssh.PublicKeys, чтобы превратить список ssh.Signers в ssh.AuthMethod. Вы можете использовать ssh.ParsePrivateKey, чтобы получить Signer из байтов pem, или если вам нужно использовать закрытый ключ rsa, dsa или ecdsa, вы можете дать их ssh.NewSignerFromKey.

Вот Например, с помощью поддержки агента также немного скрестили (поскольку использование агента обычно является следующим шагом после простого использования файла ключа).

sock, err := net.Dial("unix", os.Getenv("SSH_AUTH_SOCK"))
if err != nil {
    log.Fatal(err)
}

agent := agent.NewClient(sock)

signers, err := agent.Signers()
if err != nil {
    log.Fatal(err)
}

// or get the signer from your private key file directly
// signer, err := ssh.ParsePrivateKey(pemBytes)
// if err != nil {
//     log.Fatal(err)
// }

auths := []ssh.AuthMethod{ssh.PublicKeys(signers...)}

cfg := &ssh.ClientConfig{
    User: "username",
    Auth: auths,
}
cfg.SetDefaults()

client, err := ssh.Dial("tcp", "aws-hostname:22", cfg)
if err != nil {
    log.Fatal(err)
}

session, err = client.NewSession()
if err != nil {
    log.Fatal(err)
}

log.Println("we have a session!")

...
12
ответ дан JimB 19 August 2018 в 08:35
поделиться
  • 1
    Я не уверен, что понимаю код. Как передать файл ключа (например, mykey.pem) или ключевой контент? Похоже, что подпись - это интерфейс. У меня есть ключи, хранящиеся в db – hey 26 June 2014 в 20:11
  • 2
    Я добавил примечание об использовании ParsePrivateKey, чтобы получить подписчика от байтов pem. – JimB 26 June 2014 в 20:15
  • 3
    зачем мне agent? он кажется объявленным, но не использован, поскольку я использую signers, err := ssh.ParsePrivateKey(cl.Key) – hey 26 June 2014 в 20:37
  • 4
    вам не нужно need использовать агент в вашей программе, но так как вы должны использовать его вообще (ваши ключи все безопасно зашифрованы, верно?), это обычно следующий «как» & quot; запрос после использования простого файла закрытого ключа. – JimB 26 June 2014 в 20:46

Вот пример, чтобы запустить ls удаленно, используя ваш «файл с открытым приватным ключом».

    pemBytes, err := ioutil.ReadFile("/location/to/YOUR.pem")
    if err != nil {
        log.Fatal(err)
    }
    signer, err := ssh.ParsePrivateKey(pemBytes)
    if err != nil {
        log.Fatalf("parse key failed:%v", err)
    }
    config := &ssh.ClientConfig{
        User: "ubuntu",
        Auth: []ssh.AuthMethod{ssh.PublicKeys(signer)},
    }
    conn, err := ssh.Dial("tcp", "yourhost.com:22", config)
    if err != nil {
        log.Fatalf("dial failed:%v", err)
    }
    defer conn.Close()
    session, err := conn.NewSession()
    if err != nil {
        log.Fatalf("session failed:%v", err)
    }
    defer session.Close()
    var stdoutBuf bytes.Buffer
    session.Stdout = &stdoutBuf
    err = session.Run("ls -l")
    if err != nil {
        log.Fatalf("Run failed:%v", err)
    }
    log.Printf(">%s", stdoutBuf)
5
ответ дан emicklei 19 August 2018 в 08:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: