ホームページ >バックエンド開発 >Golang >Go で変数引数を使用してシステムコマンドを安全に実行するにはどうすればよいですか?

Go で変数引数を使用してシステムコマンドを安全に実行するにはどうすればよいですか?

DDD
DDDオリジナル
2024-12-13 08:00:19323ブラウズ

How to Safely Execute System Commands with Variable Arguments in Go?

可変引数を使用したシステム コマンドの実行

複数の引数を含むシステム コマンドを実行する場合は、コマンドと引数を分離する必要があります。以下のコードは、この概念を示しています。

import (
    "fmt"
    "os/exec"
    "strings"
    "sync"
)

func exeCmd(cmd string, wg *sync.WaitGroup) {
    fmt.Println("command is ", cmd)
    // Splitting head (e.g., "g++") from the rest of the command (e.g., "-c file.cpp")
    parts := strings.Fields(cmd)
    head := parts[0]
    parts = parts[1:len(parts)]

    out, err := exec.Command(head, parts...).Output()
    if err != nil {
        fmt.Printf("%s", err)
    }
    fmt.Printf("%s", out)
    wg.Done() // Signal to waitgroup that this goroutine is done
}

func main() {
    wg := new(sync.WaitGroup)
    wg.Add(3)

    x := []string{
        "echo newline >> foo.o",
        "echo newline >> f1.o",
        "echo newline >> f2.o"}

    go exeCmd(x[0], wg)
    go exeCmd(x[1], wg)
    go exeCmd(x[2], wg)

    wg.Wait()
}

このコード内:

  • exec.Command(head, Parts...) は、Go の可変引数を使用してコマンドを引数から分離します。 .
  • head 変数にはシステム コマンドが含まれます (例: "echo").
  • parts 変数には残りの引数が含まれます (例: "newline >> foo.o")。
  • strings.Fields(cmd) 関数は次の目的で使用されます。コマンドをその構成部分に分割します。

このアプローチを使用すると、プログラムはシステム コマンドを実行できます。任意の数の引数。これにより、複数の単語を含むコマンドが失敗するという元のコードの制限が克服されます。

以上がGo で変数引数を使用してシステムコマンドを安全に実行するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。