如何在Golang中执行带sudo密码的shell命令并自动填充密码
错误原因
你编写的代码无法正常运行的核心原因是 Go 的exec.Command不会默认解析 Shell 语法,你传入的管道符|、引号都会被当成普通字符串参数处理,不会触发 Shell 的管道、参数解析逻辑。
正确实现方案
方案1:直接向 sudo 进程标准输入写入密码(更安全,推荐)
这种方式不需要借助 Shell 解析,直接将密码写入sudo的标准输入,避免拼接命令串带来的注入风险:
package main import ( "io" "os/exec" ) func main() { datetime := "2021-06-17 18:20:41.8" sudoPassword := "xxxxx" // 直接构造sudo + date命令,不需要echo和管道 cmd := exec.Command("sudo", "-S", "date", "-s", datetime) // 获取命令的标准输入管道 stdin, err := cmd.StdinPipe() if err != nil { panic(err) } defer stdin.Close() // 启动命令 if err = cmd.Start(); err != nil { panic(err) } // 向标准输入写入密码,末尾加换行模拟手动输入后回车的操作 _, err = io.WriteString(stdin, sudoPassword+"\n") if err != nil { panic(err) } // 等待命令执行完成 if err = cmd.Wait(); err != nil { panic(err) } }
方案2:调用 Shell 执行完整命令串(和 Python os.system 逻辑完全对齐)
如果你需要完全复刻 Python 示例的实现逻辑,可以显式调用 Shell 来解析整个命令串:
package main import "os/exec" func main() { datetime := "2021-06-17 18:20:41.8" sudoPassword := "xxxxx" // 构造完整的Shell命令串 fullCmd := "echo " + sudoPassword + " | sudo -S date -s \"" + datetime + "\"" // 调用sh -c执行命令串,逻辑和os.system完全一致 cmd := exec.Command("sh", "-c", fullCmd) err := cmd.Run() if err != nil { panic(err) } }
注意事项
- 两种方案都需要确保运行程序的用户在 sudoers 配置中拥有
date命令的执行权限,无额外的密码验证限制。 - 方案1避免了密码和时间参数的 Shell 转义问题,安全性更高,优先推荐使用。
内容的提问来源于stack exchange,提问作者xc wang
相关产品推荐
相关产品推荐

