登录
首页 >  Golang >  Go问答

Golang 写入输入并从终端进程获取输出

来源:Golang技术栈

时间:2023-03-29 12:53:09 311浏览 收藏

学习Golang要努力,但是不要急!今天的这篇文章《Golang 写入输入并从终端进程获取输出》将会介绍到golang等等知识点,如果你想深入学习Golang,可以关注我!我会持续更新相关文章的,希望对大家都能有所帮助!

问题内容

我有一个关于如何从终端子进程(如 ssh)发送输入和接收输出的问题。python中的一个例子是这样的:

[如何给子进程一个密码并同时获取标准输出](https://stackoverflow.com/questions/17118239/how-to- give-subprocess-a-password-and-get-stdout-at-the-same-time?lq=1)

我在 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 访问权限。我使用了 golang 的 ssh api 库。当我按照以下示例进行操作时,这相当简单:

https://code.google.com/p/go/source/browse/ssh/example_test.go?repo=crypto

具体来说:

func ExampleDial() {
    // An SSH client is represented with a ClientConn. Currently only
    // the "password" authentication method is supported.
    //
    // To authenticate with the remote server you must pass at least one
    // implementation of AuthMethod via the Auth field in ClientConfig.
    config := &ClientConfig{
            User: "username",
            Auth: []AuthMethod{
                    Password("yourpassword"),
            },
    }
    client, err := Dial("tcp", "yourserver.com:22", config)
    if err != nil {
            panic("Failed to dial: " + err.Error())
    }

    // Each ClientConn can support multiple interactive sessions,
    // represented by a Session.
    session, err := client.NewSession()
    if err != nil {
            panic("Failed to create session: " + err.Error())
    }
    defer session.Close()

    // Once a Session is created, you can execute a single command on
    // the remote side using the Run method.
    var b bytes.Buffer
    session.Stdout = &b
    if err := session.Run("/usr/bin/whoami"); err != nil {
            panic("Failed to run: " + err.Error())
    }
    fmt.Println(b.String())
}

到这里,我们也就讲完了《Golang 写入输入并从终端进程获取输出》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于golang的知识点!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>