Мне нужно использовать пароль, прошедший проверку подлинности, для загрузки файла с сервера. Как мне это сделать с помощью 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()
}
Не делайте этого; настройте свой 'ssh' для общедоступных/закрытых ключей –
Там несколько случаев, когда мне это нужно, было бы полезно, если бы вы могли предоставить некоторую помощь :) – user2509594
Проблема в том, что приглашение пароля не относится к вашему stdin/stdout, но к устройству/dev/tty. Возможно, можно обойти это, используя псевдотерминальные соединения, но я этого не видел. –