gpt4 book ai didi

go - 通过 go exec.cmd 运行 SCP

转载 作者:数据小太阳 更新时间:2023-10-29 03:11:15 27 4
gpt4 key购买 nike

我正在尝试通过 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 session 传输二进制文件?提前致谢。

最佳答案

我假设您使用的是 Linux。如果您想从命令行向 scp 传递密码,最好的方法是使用 sshpass。它应该可以从主要 Linux 发行版的默认包存储库中安装,只需使用 aptyum 安装即可。语法是 sshpass -p [password] scp ...

在这里,我生成了一个 bash session ,并从 StdinPipe 向它发送命令:

func main() { 
cmd := exec.Command("bash")
cmdWriter, _ := cmd.StdinPipe()
cmd.Start()

cmdString := fmt.Sprintf("sshpass -p %s scp -r %s %s@%s:%s", password, src, user, client, dest)

cmdWriter.Write([]byte(cmdString + "\n"))
cmdWriter.Write([]byte("exit" + "\n"))

cmd.Wait()
}

为了简洁起见,我忽略了错误并稍微简化了您的代码。


但是,“github.com/pkg/sftp”包更易于用于此类文件传输。您可以找到一个如何使用它的简单示例 here .请注意,在客户端配置中对 HostKeyCallback 使用 nil 已被弃用 - 如果您绝对需要接受所有主机,请使用 HostKeyCallback: ssh.InsecureIgnoreHostKey()键。

关于go - 通过 go exec.cmd 运行 SCP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51114171/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com