Maison >développement back-end >Golang >Comment puis-je exécuter des commandes externes en tant qu'utilisateur différent dans Go en utilisant os/exec ?

Comment puis-je exécuter des commandes externes en tant qu'utilisateur différent dans Go en utilisant os/exec ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-20 06:18:10297parcourir

How Can I Execute External Commands as a Different User in Go Using os/exec?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn