ホームページ > バックエンド開発 > Golang > Go で入力を exec.Command() にリダイレクトする方法は?

Go で入力を exec.Command() にリダイレクトする方法は?

Barbara Streisand
リリース: 2024-12-05 04:21:09
オリジナル
318 人が閲覧しました

How to Redirect Input to exec.Command() in Go?

exec.Command() による入力のリダイレクト

Go で入力リダイレクトを使用してコマンドを発行するのは難しい場合があります。一般的なコマンドライン操作を考えてみましょう。

/sbin/iptables-restore < /etc/iptables.conf
ログイン後にコピー

このコマンドは、iptables-restore に /etc/iptables.conf から設定を読み取るように指示します。 Go の exec.Command() を使用してこれを実現するにはどうすればよいですか?

失敗した試行

入力ファイルのパスを引数として渡すか、ファイル名を stdin にパイプする最初の試行

// Fails
cmd := exec.Command("/sbin/iptables-restore", "<", "/etc/iptables.conf")

// Also fails
cmd := exec.Command("/sbin/iptables-restore", "< /etc/iptables.conf")

// Attempt to pipe file name into stdin
// Fails
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")
ログイン後にコピー

解決策: 読み取りと書き込みファイルの内容

コマンドを正常に実行するには、まず /etc/iptables.conf の内容を読み取り、次にそれらの内容を StdinPipe() に書き込む必要があります。

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)
    }
}
ログイン後にコピー

以上がGo で入力を exec.Command() にリダイレクトする方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート