Heim >Backend-Entwicklung >Golang >Wie leite ich Eingaben in Go ordnungsgemäß an „exec.Command' um?

Wie leite ich Eingaben in Go ordnungsgemäß an „exec.Command' um?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-05 05:49:09422Durchsuche

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

exec.Command mit Eingabeumleitung

In Go ermöglicht die Funktion exec.Command die Ausführung externer Befehle. Um Eingaben über eine Pipe in den Befehl umzuleiten, muss die StdinPipe-Methode verwendet werden.

Betrachten Sie die folgende Aufgabe: Ausführen des Befehls „/sbin/iptables-restore < /etc/iptables.conf“. Dieser Befehl aktualisiert die IPTables basierend auf einer Konfigurationsdatei, aber die Konfiguration der Eingabeumleitung mit exec.Command kann eine Herausforderung sein.

Der erste Versuch, exec.Command("/sbin/iptables-restore", "< ;", "/etc/iptables.conf") interpretiert das < falsch. als Befehlsflagge. Darüber hinaus interpretiert die Verwendung von exec.Command("/sbin/iptables-restore", "< /etc/iptables.conf") < als Argument für IPTables und führt zu einem Fehler.

Um dieses Problem zu beheben, stellen Sie die Eingabedaten explizit über die stdin-Pipe bereit:

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)
    }
}

Mit diesem Code wird die IPTables-Konfigurationsdatei gelesen und in cmd.StdinPipe() geschrieben, um die gewünschte Eingabeumleitung zu erreichen.

Das obige ist der detaillierte Inhalt vonWie leite ich Eingaben in Go ordnungsgemäß an „exec.Command' um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn