【发布时间】:2018-12-09 09:11:20
【问题描述】:
我正在尝试通过 golang 的 exec.cmd 将 scp 作为命令运行,因为可用于 scp 传输的非官方实现对我不起作用。 Scp 一直执行,直到它要求输入密码,然后我无法将数据写入标准输入。是否有可能将标准输入重定向到其他地方?
var cmd *exec.Cmd
if m.IsDir() {
cmd = exec.Command("scp", "-r", src, user+"@"+client.Host+":"+dest)
} else {
cmd = exec.Command("scp", src, user+"@"+client.Host+":"+dest)
}
cmdWriter, err := cmd.StdinPipe()
if err != nil {
return err
}
err = cmd.Start()
if cred.Typ() == "PW" {
cmdWriter.Write( []byte(cred.Data()+"\n") )
} else {
log.Println( "credential typ not supported" )
}
err = cmd.Wait()
log.Println( "done" )
return err
将 cmd.Stdin 设置为 os.Stdin 可以,但当然我必须手动输入密码,这不是我想要的。 还是您总体上不推荐这种方式来运行 scp?我能够在服务器上运行简单的 SSH 命令(使用“golang.org/x/crypto/ssh”)。有没有办法仅通过 SSH 会话传输二进制文件? 提前致谢。
【问题讨论】:
-
看看如何实现 scp:github.com/viant/toolbox/blob/master/ssh
-
谢谢,但我真的在寻找一个简单的解决方案。我已经尝试了一些 scp 实现。
-
你看过
cmd是否有输出?它不一定会返回,因为它可能会显示错误的密码或其他内容。 -
不写入 stdIn 只是没有效果。我什至尝试将输入设置为 os.stdin,然后使用 os.stdin.write 进行写入,但它不起作用。它只有在我手动输入时才有效。我现在非常有信心 scp 创建一个子进程,一旦它将 user@10.1.1.2' 密码写入输出,就不再使用旧管道。