>백엔드 개발 >Golang >Go에서 입력을 exec.Command()로 리디렉션하는 방법은 무엇입니까?

Go에서 입력을 exec.Command()로 리디렉션하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-05 04:21:09376검색

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.