Exécuter des commandes externes en tant qu'utilisateur différent avec os/exec
L'exécution de commandes externes sous un utilisateur spécifique est une tâche courante dans l'administration système et développement d'applications. Dans Go, le package os/exec fournit une interface pratique pour exécuter des commandes externes, mais il les exécute généralement sous les privilèges de l'utilisateur actuel. Cela peut devenir problématique lorsque vous devez exécuter des commandes en tant qu'utilisateur différent, notamment sans recourir à des outils externes tels que "su" ou "bash".
Pour résoudre ce problème, os/exec propose une solution avec l'appel système. .Credential struct, qui peut être ajouté au champ Cmd.SysProcAttr pour spécifier l'ID utilisateur et l'ID de groupe sous lesquels la commande externe doit être exécutée. Voici comment vous pouvez l'implémenter :
import ( "fmt" "os/exec" "syscall" "strconv" "user" ) func RunExternalCommandAsUser(username, command string, args ...string) error { // Lookup the user by name u, err := user.Lookup(username) if err != nil { return fmt.Errorf("failed to lookup user %s: %v", username, err) } // Convert the UID to an integer uid, err := strconv.Atoi(u.Uid) if err != nil { return fmt.Errorf("failed to convert UID to integer: %v", err) } // Create a new command object cmd := exec.Command(command, args...) // Set the SysProcAttr field with the Credential struct cmd.SysProcAttr = &syscall.SysProcAttr{ Credential: &syscall.Credential{Uid: uid, Gid: -1}, // -1 indicates to keep the current group } // Execute the command err = cmd.Run() if err != nil { return fmt.Errorf("failed to execute command: %v", err) } return nil }
Cette fonction prend le nom d'utilisateur, la commande externe et tous les arguments en entrée et exécute la commande sous les privilèges de l'utilisateur spécifié. Il garantit que le processus externe s'exécute en tant qu'utilisateur prévu sans modifier les privilèges utilisateur du processus Go principal.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!