Maison > développement back-end > Golang > Comment exécuter une commande avec redirection d'entrée à l'aide de « exec.Command » de Go ?

Comment exécuter une commande avec redirection d'entrée à l'aide de « exec.Command » de Go ?

Mary-Kate Olsen
Libérer: 2024-12-12 16:44:15
original
573 Les gens l'ont consulté

How to Execute a Command with Input Redirection Using Go's `exec.Command`?

Exécution de commandes avec redirection d'entrée dans Go : un guide complet

Dans Go, l'exploitation de la fonction exec.Command fournit un moyen puissant d'exécuter des commandes. Cependant, lorsqu'il s'agit d'exécuter des commandes avec redirection d'entrée, il est crucial de comprendre comment utiliser correctement exec.Command. Cette question explore comment exécuter une simple commande Bash qui lit à partir d'un fichier à l'aide de exec.Command.

Énoncé du problème

L'objectif est d'exécuter la commande suivante depuis Go :

/sbin/iptables-restore < /etc/iptables.conf
Copier après la connexion

Cette commande lit la configuration IPTables à partir du fichier spécifié et actualise les IPTables. Cependant, traduire cette commande directement en code Go à l'aide de exec.Command s'avère difficile.

Tentatives de solutions

La question décrit plusieurs tentatives infructueuses d'exécution de la commande avec exec.Command. Deux approches courantes sont :

  1. Tentative de transmission de l'opérateur de redirection < comme argument :

    cmd := exec.Command("/sbin/iptables-restore", "<", "/etc/iptables.conf")
    Copier après la connexion
  2. Tentative de rediriger le nom de fichier vers l'entrée standard de la commande :

    cmd := exec.Command("/sbin/iptables-restore")
    stdin, err := cmd.StdinPipe()
    if err != nil {
        log.Fatal(err)
    }
    err = cmd.Start()
    if err != nil {
        log.Fatal(err)
    }
    io.WriteString(stdin, "/etc/iptables.conf")
    Copier après la connexion

Une solution complète

La clé pour exécuter avec succès la commande avec la redirection d'entrée réside dans l'utilisation d'une combinaison de ioutil.ReadFile et exec.Command. La solution suivante y parvient :

package main

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

func main() {
    bytes, err := ioutil.ReadFile("/etc/iptables.conf")
    if err != nil {
        log.Fatal(err)
    }
    cmd := exec.Command("/sbin/iptables-restore")
    stdin, err := cmd.StdinPipe()
    if err != nil {
        log.Fatal(err)
    }
    err = cmd.Start()
    if err != nil {
        log.Fatal(err)
    }
    _, err = io.WriteString(stdin, string(bytes))
    if err != nil {
        log.Fatal(err)
    }
}
Copier après la connexion

En lisant d'abord le contenu du fichier de configuration IPTables, puis en l'écrivant sur l'entrée standard de la commande, nous effectuons efficacement l'opération de redirection d'entré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!

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