【问题标题】:How to programmatically enter a character to os.stdin in a golang program如何在 golang 程序中以编程方式将字符输入到 os.stdin
【发布时间】:2013-05-31 17:27:09
【问题描述】:

我想自动为 bash 终端中的命令提供输入。

是否可以在 ssh 提示符之后以编程方式输入“是”?这是一个代表这个想法的脚本。

package main
import (
    "bytes"
    "io"
    "os"
    "fmt"
    "os/exec"
 )
func main() {
    c1 := exec.Command("ssh","root@172.30.0.77")
    r, w := io.Pipe()
    c1.Stdout = w
    c1.Stdin = r
    c1.Start()
    var b bytes.Buffer
    b.Write([]byte("yes"))
    fmt.Fprintf(&b, "\n")
    b.WriteTo(os.Stdin)
    c1.Wait()
    w.Close()

 }

# go run login.go 
yes
The authenticity of host '172.30.0.77 (172.30.0.77)' can't be established.
RSA key fingerprint is 13:46:96:ff:ab:12:76:0e:24:6e:3e:7a:ee:c0:81:af.
Are you sure you want to continue connecting (yes/no)? 

【问题讨论】:

    标签: command go


    【解决方案1】:

    这在很多层面上都是错误的,但让我选择最糟糕的一个。

    许多程序,通常出于很好的理由,努力确保它们与人类交互,而不是重定向的输入,这里是 doc 等。

    试图颠覆这些非常好的理由是一个可怕的想法,恕我直言,这是一个很大的禁忌。

    如果您想以编程方式与 ssh 协议交互,请使用库(在 Go 中为 package),而不是客户端二进制文件。

    【讨论】:

    • 谢谢,使用库是个好方法,我需要改变我的看法。在我的工作环境中,有很多不同的脚本,我只是想整合它们。
    • 或添加任何选项被称为跳过此检查(理想情况下仅适用于新连接)。
    • 我不认为“你做错了”是一个好的答案。管道是一种提供标准输入的程序化方式,但这显然不是“错误的”。
    猜你喜欢
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 2015-08-28
    • 2018-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多