在 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中文網其他相關文章!