登录
首页 >  Golang >  Go问答

管道在多个字符串中的应用

来源:stackoverflow

时间:2024-02-16 08:24:25 461浏览 收藏

目前golang学习网上已经有很多关于Golang的文章了,自己在初次阅读这些文章中,也见识到了很多学习思路;那么本文《管道在多个字符串中的应用》,也希望能帮助到大家,如果阅读完后真的对你学习Golang有帮助,欢迎动动手指,评论留言并分享~

问题内容

我正在尝试使用 go 执行以下 shell 命令。

{ echo $password; echo $password; } | kadmin.local -q 'cpw user'

下面的 changepassword 不允许我将两个密码通过管道输入到 kadmin.local 实用程序。我有另一个实用程序,我只需要传递一个密码,并且此功能工作正常(如果我删除第 3 行)

// Update Password
func changePassword(password string, principal string) {
    cmd := exec.Command("kadmin.local", "-q", "cpw "+principal)
    cmd.Stdin = strings.NewReader(password)
    cmd.Stdin = strings.NewReader(password) // Remove when one password require.
    var out bytes.Buffer
    cmd.Stdout = &out
    err := cmd.Run()
    check(err)
    fmt.Println(out.String())
}

我尝试了其他方法https://stackoverflow.com/a/10953142/3082827,但我无法弄清楚如何使其工作。


解决方案


kadmin 程序直接从控制终端(如果有)读取密码,而不是从标准输入读取密码。这意味着设置 cmd.stdin 很可能没有效果。幸运的是,有一个 -pw 选项: change_password -pw password principalcpwchange_password 的缩写);不幸的是,使用此选项并不安全。

除了使用 -pw 之外,您还有两个选择:

  • 提供一个控制终端,它是一个伪终端,以便您可以提供密码;或
  • 确保没有控制终端,以便 kadmin 使用标准输入。

如果您选择后者,则通过 cmd.stdin 发送的正确内容是密码重复两次,每次末尾都有换行符。也就是说,而不是:

cmd.stdin = strings.newreader(password)
cmd.stdin = strings.newreader(password)

(它只是创建然后丢弃一个阅读器实例)您想要:

cmd.Stdin = strings.NewReader(password + "\n" + password + "\n")

或类似的。

今天关于《管道在多个字符串中的应用》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

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