在 Go 中使用 sudo 执行 Shell 命令
在 Go 中执行命令时,重要的是要考虑 exec.Command() 的限制。该函数直接执行进程,而某些命令可能需要 shell 脚本来解释。
exec.Command() 和 Shell 命令
在给定的代码中,命令正在执行的是一个复杂的 shell 脚本:
sudo find /folder -type f | while read i; do sudo -S chmod 644 "$i"; done
exec.Command() 无法直接解释此脚本,因为它期望执行单个进程。要在 Go 中执行 shell 脚本,我们需要使用不同的方法。
使用 /bin/sh
一种解决方案是使用 /bin/sh,它是 Unix 系统上的默认 shell,用于解释脚本。我们可以通过将 /bin/sh 作为第一个参数传递给 exec.Command() 来做到这一点,然后传递 -c 标志来指示我们正在传递要执行的命令。例如:
cmd := exec.Command("/bin/sh", "-c", "sudo find ...")
通过这种方法,shell 将执行作为第三个参数传递的命令,允许我们使用 exec.Command() 执行 shell 脚本。
处理执行错误
处理执行失败时,exec.Command() 只提供通用的“退出状态 1” 错误信息。要获取更详细的错误信息,请考虑使用 exec.ExitError 类型。此类型提供对命令退出状态代码和可选退出消息的访问。例如:
if err, ok := err.(*exec.ExitError); ok { fmt.Printf("Exit status: %d\n", err.ExitCode()) if err.ExitCode() == 1 { // Handle exit status 1 error here. } }
这允许您处理特定的退出代码并提供更详细的错误信息。
以上是如何在 Go 中安全执行复杂的 Shell 命令,包括'sudo”?的详细内容。更多信息请关注PHP中文网其他相关文章!