为了账号安全,请及时绑定邮箱和手机立即绑定

多串管道。

多串管道。

Go
墨色风雨 2022-07-18 17:15:35
我正在尝试使用 Go 执行以下 shell 命令。{ echo $password; echo $password; } | kadmin.local -q 'cpw user'下面changePassword不允许我将两个密码都输入kadmin.local实用程序。我有另一个实用程序,我只需要传递一个密码并且此功能工作正常(如果我删除第 3 行)// Update Passwordfunc 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但我无法弄清楚如何使这项工作。
查看完整描述

2 回答

?
慕容708150

TA贡献1831条经验 获得超4个赞

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")

或类似的。


查看完整回答
反对 回复 2022-07-18
?
白板的微信

TA贡献1883条经验 获得超3个赞

这对我有用。发布我的解决方案以防有人绊倒。


// Updating Password

func 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)

}


查看完整回答
反对 回复 2022-07-18
  • 2 回答
  • 0 关注
  • 119 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信