You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 03:39:04