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

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

Linda Hamilton
Linda Hamiltonoriginal
2024-12-29 00:21:10925parcourir

How Can I Execute External Commands as a Different User in Go?

Exécuter des commandes externes sous un utilisateur différent avec Go

Dans le vaste paysage de la programmation système, la possibilité d'exécuter des commandes externes sous les auspices d'un autre utilisateur est souvent indispensable. Alors que les méthodes traditionnelles peuvent impliquer d'exploiter les utilitaires « su » ou « bash », une approche plus efficace et purement basée sur Go peut être obtenue.

Pour accomplir cette tâche, le package os/exec fournit un ensemble complet de fonctions de gestion de l’exécution des processus externes. Cependant, son comportement par défaut exécute des commandes sous les privilèges du processus en cours. Pour exécuter des commandes en tant qu'utilisateur différent, nous plongeons dans le domaine de la structure syscall.Credential.

En ajoutant une structure Credential au champ SysProcAttr de l'objet Cmd, nous pouvons spécifier les informations d'identification (c'est-à-dire l'UID et GID) sous lequel la commande externe doit s'exécuter. L'extrait de code suivant illustre cette approche :

package main

import (
    "fmt"
    "os/exec"
    "strconv"
    "syscall"
)

func main() {
    // Capture the UID of the desired user
    u, err := user.Lookup("another_user")
    if err != nil {
        fmt.Printf("%v", err)
        return
    }

    // Parse the UID into an integer and construct the Credential
    uid, err := strconv.Atoi(u.Uid)
    if err != nil {
        fmt.Printf("%v", err)
        return
    }
    credential := &syscall.Credential{Uid: uid}

    // Compose the command
    command := exec.Command("ls", "-l")

    // Configure the command's SysProcAttr with the Credential
    command.SysProcAttr = &syscall.SysProcAttr{}
    command.SysProcAttr.Credential = credential

    // Execute the command and process its output
    output, err := command.CombinedOutput()
    if err != nil {
        fmt.Printf("%v", err)
        return
    }

    fmt.Println(string(output))
}

Avec cette approche, nous obtenons un contrôle précis sur l'environnement d'exécution de nos commandes externes, nous permettant de spécifier précisément l'utilisateur sous lequel elles doivent s'exécuter.

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