我正在尝试使用 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 principal
cpw
change_password
那么,除了使用 之外-pw
,您还有两个选择:
提供一个伪终端的控制终端,以便您提供密码;或者
确保没有控制终端,以便
kadmin
使用标准输入。
如果你做后者,正确的发送方式cmd.Stdin
是密码重复两次,每次最后都有一个换行符。也就是说,而不是:
cmd.Stdin = strings.NewReader(password) cmd.Stdin = strings.NewReader(password)
(它只是创建然后丢弃一个阅读器实例)你会想要:
cmd.Stdin = strings.NewReader(password + "\n" + password + "\n")
或类似的。
白板的微信
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)
}
- 2 回答
- 0 关注
- 119 浏览
添加回答
举报
0/150
提交
取消