猿问

多串管道。

我正在尝试使用 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但我无法弄清楚如何使这项工作。


墨色风雨
浏览 120回答 2
2回答

慕容708150

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")或类似的。

白板的微信

这对我有用。发布我的解决方案以防有人绊倒。// Updating Passwordfunc changePassword(password string, principal string) {    b.Write([]byte(password + "" + password))    var b bytes.Buffer    b.Write([]byte(password + "\n" + password + "\n"))    cmd.Stdin = &b    cmd.Stdout = os.Stdout    cmd.Stderr = os.Stderr    err := cmd.Run()    check(err)}
随时随地看视频慕课网APP

相关分类

Go
我要回答