【发布时间】:2014-04-11 18:18:45
【问题描述】:
我有一个关于如何从终端子进程(如 ssh)发送输入和接收输出的问题。 python中的一个例子是这样的:
how to give subprocess a password and get stdout at the same time
我在 Golang 中找不到与上述工作方式类似的简单示例。
在 Golang 中我想做这样的事情,但它似乎不起作用:
cmd := exec.Command("ssh", "user@x.x.x.x")
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
stdin, _ := cmd.StdinPipe()
stdin.Write([]byte("password\n"))
cmd.Run()
但是;我不确定如何在 go 中执行此操作,因为每次执行此 ssh 命令时,我只能获得输出。我无法从代码中自动输入我的密码。 有没有人有写入终端进程(如 ssh)的示例?如果有,请分享。
【问题讨论】:
-
你不能用
ssh很容易地做到这一点,因为它会拒绝从stdin读取密码。见stackoverflow.com/q/1340366。您最好的选择似乎是生成一个密钥对并使用它进行身份验证。 -
我以前在 Python 中尝试过这样做。我只能使用Paramiko 让它工作。你应该试试go.crypto/ssh。
-
您似乎知道如何处理子进程的标准输入和标准输出就好了。问题不在您的代码中,而是由于 ssh 在检测到它没有在 shell 或 tty 中运行时具有不同的行为。您必须使用证书身份验证而不是密码。
-
cmd.Env = append(cmd.Env, 'TERM=xterm')有帮助吗? -
@OneOfOne 感谢您的输入,这正是我正在寻找的。感谢上帝。