在 Go 中,os/exec 包提供了一种从程序运行外部命令的方法。但是,默认情况下,命令以与程序本身相同的用户权限运行。
以不同用户权限运行命令无需求助于 su 或 bash 命令,您可以使用 syscall.Credential。下面是一个示例:
import ( "os/exec" "syscall" ) func runAsUser(command string, args []string, username string) error { // Look up the target user's UID and GID u, err := user.Lookup(username) if err != nil { return err } uid, err := strconv.Atoi(u.Uid) if err != nil { return err } gid, err := strconv.Atoi(u.Gid) if err != nil { return err } // Create a command and set its SysProcAttr to run as the specified user cmd := exec.Command(command, args...) cmd.SysProcAttr = &syscall.SysProcAttr{ Credential: &syscall.Credential{Uid: uint32(uid), Gid: uint32(gid)}, } // Run the command return cmd.Run() }
虽然由于潜在的安全风险而不推荐,但您也可以使用 syscall.Setuid 更改有效用户 ID当前的
import ( "os" "syscall" ) func setUid(username string) error { // Look up the target user's UID u, err := user.Lookup(username) if err != nil { return err } uid, err := strconv.Atoi(u.Uid) if err != nil { return err } // Set the effective user ID to the specified user return syscall.Setuid(uid) }
注意:
以上是如何在不使用 su 或 bash 的情况下以 Go 中的另一个用户身份运行外部命令?的详细内容。更多信息请关注PHP中文网其他相关文章!