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 サイトの他の関連記事を参照してください。