ホームページ >バックエンド開発 >Golang >su や bash を使用せずに Go で別のユーザーとして外部コマンドを実行する方法は?

su や bash を使用せずに Go で別のユーザーとして外部コマンドを実行する方法は?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-24 02:56:10901ブラウズ

How to Run External Commands as Another User in Go Without Using su or bash?

os/exec を使用して別のユーザーとして外部コマンドを実行する

Go では、os/exec パッケージはプログラムから外部コマンドを実行する方法を提供します。ただし、デフォルトでは、コマンドはプログラム自体と同じユーザー権限で実行されます。

別のユーザーとしてコマンドを実行する (su/bash なし)

別のユーザーの権限でコマンドを実行するにはsu または bash コマンドに頼らずに、syscall.Credential を使用できます。以下に例を示します。

import (
    "os/exec"
    "syscall"
)

func runAsUser(command string, args []string, username string) error {
    // Look up the target user's UID and GID
    u, err := user.Lookup(username)
    if err != nil {
        return err
    }

    uid, err := strconv.Atoi(u.Uid)
    if err != nil {
        return err
    }
    gid, err := strconv.Atoi(u.Gid)
    if err != nil {
        return err
    }

    // Create a command and set its SysProcAttr to run as the specified user
    cmd := exec.Command(command, args...)
    cmd.SysProcAttr = &syscall.SysProcAttr{
        Credential: &syscall.Credential{Uid: uint32(uid), Gid: uint32(gid)},
    }

    // Run the command
    return cmd.Run()
}

Setuid を使用した代替方法 (非推奨)

潜在的なセキュリティ リスクのため推奨されませんが、syscall.Setuid を使用して、実効ユーザー ID を変更することもできます。現在process.

import (
    "os"
    "syscall"
)

func setUid(username string) error {
    // Look up the target user's UID
    u, err := user.Lookup(username)
    if err != nil {
        return err
    }

    uid, err := strconv.Atoi(u.Uid)
    if err != nil {
        return err
    }

    // Set the effective user ID to the specified user
    return syscall.Setuid(uid)
}

注:

  • 上記の例は、現在のプロセスが適切な su 権限を持つ root として実行されていることを前提としています。
  • 環境変数を子プロセスに渡す必要がある場合は、次を使用して環境変数を設定できます。 Cmd.Env.
  • プロセス全体で発生する可能性のあるエラーを処理することが重要です。

以上がsu や bash を使用せずに Go で別のユーザーとして外部コマンドを実行する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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