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
Libérer: 2024-12-02 03:08:10
original
667 Les gens l'ont consulté

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

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

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

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!

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