ホームページ >バックエンド開発 >Golang >Go で「sudo」を含む複雑なシェル コマンドを安全に実行するにはどうすればよいですか?

Go で「sudo」を含む複雑なシェル コマンドを安全に実行するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-02 03:08:10678ブラウズ

How Can I Safely Execute Complex Shell Commands, Including `sudo`, in Go?

Go で sudo を使用してシェル コマンドを実行する

Go でコマンドを実行する場合は、exec.Command() の制限を考慮することが重要です。この関数はプロセスを直接実行しますが、一部のコマンドでは解釈にシェル スクリプトが必要な場合があります。

exec.Command() およびシェル コマンド

指定されたコードでは、コマンド実行されているのは複雑なシェル スクリプトです:

sudo find /folder -type f | while read i; do sudo -S chmod 644 "$i"; done

exec.Command() はこのスクリプトを直接解釈できません。単一のプロセスを実行します。 Go でシェル スクリプトを実行するには、別のアプローチを使用する必要があります。

/bin/sh の使用

解決策の 1 つは、/bin/sh を使用することです。スクリプトを解釈するための Unix システム上のデフォルトのシェルです。これを行うには、最初の引数として /bin/sh を exec.Command() に渡し、その後に実行するコマンドを渡すことを示す -c フラグを渡します。例:

cmd := exec.Command("/bin/sh", "-c", "sudo find ...")

このアプローチでは、シェルは 3 番目の引数として渡されたコマンドを実行し、exec.Command() を使用してシェル スクリプトを実行できるようになります。

実行エラーの処理

実行エラーを処理する場合、exec.Command() はジェネリックのみを提供します。 「終了ステータス 1」エラー メッセージ。より詳細なエラー情報を取得するには、exec.ExitError タイプの使用を検討してください。このタイプでは、コマンドの終了ステータス コードとオプションの終了メッセージへのアクセスが提供されます。例:

if err, ok := err.(*exec.ExitError); ok {
    fmt.Printf("Exit status: %d\n", err.ExitCode())
    if err.ExitCode() == 1 {
        // Handle exit status 1 error here.
    }
}

これにより、特定の終了コードを処理し、より詳細なエラー情報を提供できるようになります。

以上がGo で「sudo」を含む複雑なシェル コマンドを安全に実行するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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