ホームページ > バックエンド開発 > Golang > os/exec を使用して Go で別のユーザーとして外部コマンドを実行するにはどうすればよいですか?

os/exec を使用して Go で別のユーザーとして外部コマンドを実行するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-20 06:18:10
オリジナル
272 人が閲覧しました

How Can I Execute External Commands as a Different User in Go Using os/exec?

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート