【发布时间】:2019-06-22 10:30:11
【问题描述】:
我正在尝试执行一个要求多个输入的命令,例如,如果您尝试将文件从本地设备复制到我们使用的远程设备scp test.txt user@domain:~/,那么它会要求我们输入密码。我想要的是编写一个 go 代码,其中我在代码本身中提供密码,例如pass:='Secret Password'。同样,我有 CLI 命令,它会询问我们一些事情,例如 IP、名称等,所以我需要编写一个代码,我只需在代码本身中声明所有值,并且当我运行代码时它不会询问任何内容只需从代码中获取所有输入并运行 CLI 命令,以防将文件复制到远程它不应该在我运行我的 go 二进制文件时询问我密码它应该直接将我的文件复制到远程决定。
func main() {
cmd := exec.Command("scp", "text.txt", "user@domain:~/")
stdin, err := cmd.StdinPipe()
if err = cmd.Start(); err != nil {
log.Fatalf("failed to start command: %s", err)
}
io.WriteString(stdin, "password\n")
if err = cmd.Wait(); err != nil {
log.Fatalf("command failed: %s", err)
}
}
如果我使用此代码,它会卡在 user@domain 的密码上:
并且没有文件被复制到远程设备。
【问题讨论】:
-
尝试将密码指定为 URL 的一部分,如
user:password@domain:~/,对于其他命令,请尝试将它们指定为参数。 -
以上命令只是交互式命令的例子。我有 CLI 会问几个问题,例如
Enter Your Name或What is your IP -
您可能需要生成一个 PTY 并将子进程附加到它。