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
Libérer: 2024-12-24 02:56:10
original
892 Les gens l'ont consulté

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()
}
Copier après la connexion

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)
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal