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

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

Barbara Streisand
Barbara Streisandオリジナル
2024-11-29 10:02:09469ブラウズ

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

Os Exec を使用したシェル コマンドの実行

Go では、exec.Command() はホスト システム上で外部コマンドを実行する方法を提供します。ただし、複数のセグメントを含むコマンドやシェルの解釈が必要なコマンドを扱う場合は、追加の考慮事項が必要です。

あなたの場合、実行しようとしているコマンドは、「sudo find /folder -type f | while read」です。 i; do sudo -S chmod 644 "$i";ned" にはシェル スクリプト要素が含まれており、昇格された権限で sudo コマンドを実行する必要があります。 Go でこのようなコマンドを効果的に実行するには、シェル スクリプトとして解釈するようにカーネルに指示する必要があります。

これを解決するには、実行の最初の引数として /bin/sh を使用するようにコードを変更できます。 .Command() を実行し、コマンド文字列全体を 2 番目の引数として渡します。これは、シェル (/bin/sh) を使用してコマンドを解釈および実行するようにカーネルに指示します。

cmd := exec.Command("/bin/sh", "-c", "sudo find /folder -type f | while read i; do sudo -S chmod 644 \"$i\"; done")

詳細なエラー メッセージの取得

外部コマンドの場合exec.Command() が失敗した場合、通常は「終了ステータス 1」エラーのみを返します。より詳細なエラー メッセージを取得するには、cmd オブジェクトの Stderr フィールドを io.Writer インターフェイスを実装する変数に設定します。これにより、コマンドの標準エラー出力をキャプチャし、エラーに関するより具体的な情報を調べることができます。

次に例を示します:

output, err := cmd.CombinedOutput()
if err != nil {
    fmt.Printf("Error: %s\n", output)
}

CombinedOutput() メソッドを使用すると、コマンドの標準出力と標準エラー出力の両方を取得できます。

sudo を使用する実質的に

Go から sudo を使用してコマンドを実行する場合、Go プログラムを実行しているユーザーが sudo を実行するための十分な権限を持っていることを確認することが重要です。デフォルトでは、sudo はユーザーにパスワードの入力を要求しますが、これをプログラム内から自動化するのは難しい場合があります。

この問題を回避するには、root 権限を昇格させずにコマンドを実行する方法を提供する pkexec パッケージの使用を検討してください。 .

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

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