Maison >développement back-end >Golang >Comment exécuter des commandes externes en tant qu'autre utilisateur dans Go sans utiliser su ou bash ?

Comment exécuter des commandes externes en tant qu'autre utilisateur dans Go sans utiliser su ou bash ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-24 02:56:10948parcourir

How to Run External Commands as Another User in Go Without Using su or bash?

Exécuter des commandes externes en tant qu'autre utilisateur avec os/exec

Dans Go, le package os/exec fournit un moyen d'exécuter des commandes externes à partir d'un programme. Cependant, par défaut, les commandes sont exécutées avec les mêmes privilèges utilisateur que le programme lui-même.

Exécuter des commandes en tant qu'utilisateur différent (sans su/bash)

Pour exécuter des commandes avec les privilèges d'un autre utilisateur sans recourir aux commandes su ou bash, vous pouvez utiliser syscall.Credential. Voici un exemple :

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()
}

Méthode alternative utilisant Setuid (non recommandée)

Bien que cela ne soit pas recommandé en raison de risques de sécurité potentiels, vous pouvez également utiliser syscall.Setuid pour modifier l'ID utilisateur effectif de le courant processus.

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)
}

Remarque :

  • Les exemples ci-dessus supposent que le processus actuel s'exécute en tant que root avec les privilèges su appropriés.
  • Si vous devez transmettre des variables d'environnement au processus enfant, vous pouvez les définir à l'aide de Cmd.Env.
  • Il est crucial de gérer toute erreur pouvant survenir tout au long du processus.

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