os/exec を使用して別のユーザーとして外部コマンドを実行する
特定のユーザーの下で外部コマンドを実行することは、システム管理およびアプリケーション開発。 Go では、os/exec パッケージは外部コマンドを実行するための便利なインターフェイスを提供しますが、通常は現在のユーザーの権限で実行されます。これは、特に「su」や「bash」などの外部ツールに依存せずに、別のユーザーとしてコマンドを実行する必要がある場合に問題になる可能性があります。
この問題に対処するために、os/exec は syscall を使用した解決策を提供します。 .Credential 構造体。Cmd.SysProcAttr フィールドに追加して、外部コマンドを実行するユーザー ID とグループ ID を指定できます。実装方法は次のとおりです。
import ( "fmt" "os/exec" "syscall" "strconv" "user" ) func RunExternalCommandAsUser(username, command string, args ...string) error { // Lookup the user by name u, err := user.Lookup(username) if err != nil { return fmt.Errorf("failed to lookup user %s: %v", username, err) } // Convert the UID to an integer uid, err := strconv.Atoi(u.Uid) if err != nil { return fmt.Errorf("failed to convert UID to integer: %v", err) } // Create a new command object cmd := exec.Command(command, args...) // Set the SysProcAttr field with the Credential struct cmd.SysProcAttr = &syscall.SysProcAttr{ Credential: &syscall.Credential{Uid: uid, Gid: -1}, // -1 indicates to keep the current group } // Execute the command err = cmd.Run() if err != nil { return fmt.Errorf("failed to execute command: %v", err) } return nil }
この関数は、ユーザー名、外部コマンド、および任意の引数を入力として受け取り、指定されたユーザーの権限でコマンドを実行します。これにより、メインの Go プロセスのユーザー権限を変更することなく、外部プロセスが意図したユーザーとして実行されるようになります。
以上がos/exec を使用して Go で別のユーザーとして外部コマンドを実行するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。