2 回答
TA贡献1801条经验 获得超8个赞
文档说“使用给定的参数执行命名程序”。甚至还有一个特定的段落:
与来自 C 和其他语言的“系统”库调用不同,os/exec 包有意不调用系统 shell,也不扩展任何 glob 模式或处理通常由 shell 完成的其他扩展、管道或重定向。
因此问题中的代码echo使用参数'pgc:password'、|、sudo和执行chpasswd。这是成功的,因为echo可以完全打印这四个字符串。
解决方案是chpasswd直接启动并写入其标准输入。这是一个最小的例子:
func main() {
cmd := exec.Command("chpasswd")
stdin, err := cmd.StdinPipe()
io.WriteString(stdin, "pgc:password")
}
我建议将官方示例中显示的代码调整为带有错误检查的安全代码。
您也可以使用sudo chpasswd代替chpasswd. 请记住,sudo在这种情况下将无法要求输入密码。一种解决方法是在适当的情况下使用 NOPASSWD 配置 sudoers。
TA贡献1841条经验 获得超3个赞
谢谢赫尔曼。我的误解有点微妙。我花了很长时间试图得到你引导我工作的例子。直到一位同事建议我在参数传递给命令后抛出一个 \n ,它才最终起作用。
所以有效的代码(基本上是那个标准输入的例子,有一点改变):
cmd := exec.Command("sudo", "chpasswd")
stdin, err := cmd.StdinPipe()
if err != nil {
log.Fatal(err)
}
go func() {
defer stdin.Close()
io.WriteString(stdin, "pgc:password\n")
}()
out, err := cmd.CombinedOutput()
if err != nil {
log.Fatal(err)
}
- 2 回答
- 0 关注
- 233 浏览
添加回答
举报