Maison >développement back-end >Golang >Comment puis-je exécuter efficacement des commandes Shell complexes, y compris « sudo », dans Go ?
Exécuter des commandes Shell avec Os Exec
Dans Go, exec.Command() fournit un moyen d'exécuter des commandes externes sur le système hôte. Cependant, lorsqu'il s'agit de commandes impliquant plusieurs segments ou nécessitant une interprétation du shell, des considérations supplémentaires sont nécessaires.
Dans votre cas, la commande que vous essayez d'exécuter, " sudo find /folder -type f | while read i; do sudo -S chmod 644 "$i"; done", inclut des éléments de script shell et nécessite que la commande sudo soit exécutée avec des privilèges élevés. Pour exécuter efficacement une telle commande dans Go, vous devez demander au noyau de l'interpréter comme un script shell.
Pour résoudre ce problème, vous pouvez modifier votre code pour utiliser /bin/sh comme premier argument pour exécuter .Command() et transmettez la chaîne de commande entière comme deuxième argument. Cela indique au noyau d'utiliser le shell (/bin/sh) pour interpréter et exécuter la commande :
cmd := exec.Command("/bin/sh", "-c", "sudo find /folder -type f | while read i; do sudo -S chmod 644 \"$i\"; done")
Obtention de messages d'erreur détaillés
Lorsqu'une commande externe échoue, exec.Command() renvoie généralement uniquement une erreur « état de sortie 1 ». Pour obtenir des messages d'erreur plus détaillés, vous pouvez définir le champ Stderr de l'objet cmd sur une variable qui implémente l'interface io.Writer. Cela vous permet de capturer la sortie d'erreur standard de la commande et de l'inspecter pour obtenir des informations plus spécifiques sur l'échec.
Voici un exemple :
output, err := cmd.CombinedOutput() if err != nil { fmt.Printf("Error: %s\n", output) }
En utilisant la méthode CombinedOutput(), vous pouvez récupérer à la fois la sortie standard et la sortie d'erreur standard de la commande.
Utilisation de sudo Effectivement
Lors de l'exécution d'une commande avec sudo depuis Go, il est crucial de s'assurer que l'utilisateur exécutant le programme Go dispose des autorisations suffisantes pour exécuter sudo. Par défaut, sudo demande aux utilisateurs de saisir leur mot de passe, ce qui peut être difficile à automatiser à partir d'un programme.
Pour éviter ce problème, envisagez d'utiliser le package pkexec, qui permet d'exécuter des commandes sans élever les privilèges root. .
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!