Maison >développement back-end >Golang >Comment puis-je exécuter en toute sécurité des commandes Shell complexes, y compris « sudo », dans Go ?

Comment puis-je exécuter en toute sécurité des commandes Shell complexes, y compris « sudo », dans Go ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-02 03:08:10687parcourir

How Can I Safely Execute Complex Shell Commands, Including `sudo`, in Go?

Exécution de commandes Shell avec sudo dans Go

Lors de l'exécution de commandes dans Go, il est important de prendre en compte les limitations de exec.Command(). Cette fonction exécute les processus directement, tandis que certaines commandes peuvent nécessiter un script shell pour être interprétées.

exec.Command() et commandes Shell

Dans le code donné, la commande en cours d'exécution est un script shell complexe :

sudo find /folder -type f | while read i; do sudo -S chmod 644 "$i"; done

exec.Command() ne peut pas interpréter ce script directement car il s'attend à exécuter un seul processus. Pour exécuter un script shell dans Go, nous devons utiliser une approche différente.

Utiliser /bin/sh

Une solution consiste à utiliser /bin/sh, qui est le shell par défaut sur les systèmes Unix, pour interpréter le script. Nous pouvons le faire en passant /bin/sh comme premier argument à exec.Command(), suivi de l'indicateur -c pour indiquer que nous passons une commande à exécuter. Par exemple :

cmd := exec.Command("/bin/sh", "-c", "sudo find ...")

Avec cette approche, le shell exécutera la commande passée comme troisième argument, nous permettant d'exécuter des scripts shell en utilisant exec.Command().

Gestion des erreurs d'exécution

En cas d'échecs d'exécution, exec.Command() fournit uniquement un message d'erreur générique "état de sortie 1". Pour obtenir des informations plus détaillées sur les erreurs, envisagez d’utiliser le type exec.ExitError. Ce type donne accès au code d'état de sortie de la commande et à un message de sortie facultatif. Par exemple :

if err, ok := err.(*exec.ExitError); ok {
    fmt.Printf("Exit status: %d\n", err.ExitCode())
    if err.ExitCode() == 1 {
        // Handle exit status 1 error here.
    }
}

Cela vous permet de gérer des codes de sortie spécifiques et de fournir des informations d'erreur plus détaillées.

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