In Go bietet das Paket os/exec eine Möglichkeit, externe Befehle aus einem Programm auszuführen. Standardmäßig werden Befehle jedoch mit denselben Benutzerrechten wie das Programm selbst ausgeführt.
Um Befehle mit den Rechten eines anderen Benutzers auszuführen Ohne auf die Befehle su oder bash zurückgreifen zu müssen, können Sie syscall.Credential verwenden. Hier ist ein Beispiel:
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() }
Obwohl dies aufgrund potenzieller Sicherheitsrisiken nicht empfohlen wird, können Sie auch syscall.Setuid verwenden, um die effektive Benutzer-ID von zu ändern die jetzige Prozess.
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) }
Hinweis:
Das obige ist der detaillierte Inhalt vonWie führe ich externe Befehle als anderer Benutzer in Go aus, ohne su oder bash zu verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!