2015-02-28 2 views
1

Мне нужно использовать пароль, прошедший проверку подлинности, для загрузки файла с сервера. Как мне это сделать с помощью Go? Пробовал следующий код, но пароль не передается.Как подать пароль на SSH?

package main 

import (
    "os/exec" 
    "time" 
) 

func main() { 
    password := "password" 
    cmd := exec.Command("scp", "[email protected]:file", "file") 

    in, err := cmd.StdinPipe() 
    if err != nil { 
     panic(err) 
    } 

    defer in.Close() 

    out, err := cmd.StdoutPipe() 
    if err != nil { 
     panic(err) 
    } 

    defer out.Close() 

    if err = cmd.Run(); err != nil { 
     panic(err) 
    } 

    go func() { 
     time.Sleep(10 * time.Second) 
     _, err = in.Write([]byte(password + "\n")) 
     if err != nil { 
      panic(err) 
     } 
    }() 
} 

Edit: Я закончил с использованием gexpect библиотеки (github.com/ThomasRooney/gexpect).

package main 

import (
    "github.com/ThomasRooney/gexpect" 
    "log" 
) 

func main() { 
    child, err := gexpect.Spawn("scp [email protected]:file file") 
    if err != nil { 
     log.Fatalln(err) 
    } 
    child.Expect("password:") 
    child.SendLine("password") 
    child.Interact() 
    child.Close() 
} 
+5

Не делайте этого; настройте свой 'ssh' для общедоступных/закрытых ключей –

+1

Там несколько случаев, когда мне это нужно, было бы полезно, если бы вы могли предоставить некоторую помощь :) – user2509594

+1

Проблема в том, что приглашение пароля не относится к вашему stdin/stdout, но к устройству/dev/tty. Возможно, можно обойти это, используя псевдотерминальные соединения, но я этого не видел. –

ответ

1

Ответ на этот самостоятельно ответил на вопрос может помочь:

Golang write input and get output from terminal process

, по крайней мере, он упоминает в ответ, что он «был в состоянии получить SSH доступ, работающий с паролем», который явно не упоминается в вопросе - вот почему вы, вероятно, не нашли его при поиске на сайте?

+0

Это использует SSH-библиотеку, она подключается к серверу и вызывает scp с сервера. У меня нет scp для меня на сервере. – user2509594

+1

@ user2509594: для работы scp у вас должен быть scp на сервере. scp работает над ssh, но технически не имеет к этому никакого отношения, и двоичный код scp требуется с обеих сторон, поскольку он вызывается через 'ssh hostname scp -t' – JimB

Смежные вопросы