Maison >développement back-end >Golang >Comment rediriger correctement l'entrée vers « exec.Command » dans Go ?

Comment rediriger correctement l'entrée vers « exec.Command » dans Go ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-05 05:49:09454parcourir

How to Properly Redirect Input to `exec.Command` in Go?

exec.Command avec redirection d'entrée

En Go, la fonction exec.Command permet l'exécution de commandes externes. Pour rediriger l'entrée dans la commande via un tube, la méthode StdinPipe doit être utilisée.

Considérez la tâche suivante : exécuter la commande "/sbin/iptables-restore < /etc/iptables.conf". Cette commande met à jour les IPTables en fonction d'un fichier de configuration, mais configurer la redirection d'entrée à l'aide de exec.Command peut être un défi.

La première tentative, exec.Command("/sbin/iptables-restore", "< ;", "/etc/iptables.conf"), interprète mal le < comme drapeau de commande. De plus, l'utilisation de exec.Command("/sbin/iptables-restore", "< /etc/iptables.conf") interprète < comme argument à IPTables et entraîne une erreur.

Pour résoudre ce problème, fournissez les données d'entrée explicitement via le canal stdin :

package main

import (
    "io"
    "io/ioutil"
    "log"
    "os/exec"
)

func main() {
    // Read the contents of the input file.
    bytes, err := ioutil.ReadFile("/etc/iptables.conf")
    if err != nil {
        log.Fatal(err)
    }

    // Create the command.
    cmd := exec.Command("/sbin/iptables-restore")

    // Get the stdin pipe.
    stdin, err := cmd.StdinPipe()
    if err != nil {
        log.Fatal(err)
    }

    // Start the command.
    err = cmd.Start()
    if err != nil {
        log.Fatal(err)
    }

    // Write the input data to the stdin pipe.
    _, err = io.WriteString(stdin, string(bytes))
    if err != nil {
        log.Fatal(err)
    }

    // Ensure stdin is closed.
    err = stdin.Close()
    if err != nil {
        log.Fatal(err)
    }

    // Wait for the command to finish.
    err = cmd.Wait()
    if err != nil {
        log.Fatal(err)
    }
}

Avec ce code, le fichier de configuration IPTables est lu et écrit dans cmd.StdinPipe(), obtenant la redirection d'entrée souhaitée.

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