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!