Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Menjalankan Perintah Luaran sebagai Pengguna Lain dalam Go Tanpa Menggunakan su atau bash?

Bagaimana untuk Menjalankan Perintah Luaran sebagai Pengguna Lain dalam Go Tanpa Menggunakan su atau bash?

Linda Hamilton
Linda Hamiltonasal
2024-12-24 02:56:10901semak imbas

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

Menjalankan Perintah Luaran sebagai Pengguna Lain dengan os/exec

Dalam Go, pakej os/exec menyediakan cara untuk menjalankan perintah luaran daripada program. Walau bagaimanapun, secara lalai, arahan dijalankan dengan keistimewaan pengguna yang sama seperti program itu sendiri.

Menjalankan Perintah sebagai Pengguna Berbeza (Tanpa su/bash)

Untuk menjalankan arahan dengan keistimewaan pengguna yang berbeza tanpa menggunakan arahan su atau bash, anda boleh menggunakan syscall.Credential. Berikut ialah contoh:

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()
}

Kaedah Alternatif Menggunakan Setuid (Tidak Disyorkan)

Walaupun tidak disyorkan kerana potensi risiko keselamatan, anda juga boleh menggunakan syscall.Setuid untuk menukar ID pengguna yang berkesan bagi arus proses.

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)
}

Nota:

  • Contoh di atas menganggap bahawa proses semasa berjalan sebagai root dengan keistimewaan su yang sesuai.
  • Jika anda perlu menghantar pembolehubah persekitaran kepada proses anak, anda boleh menetapkannya menggunakan Cmd.Env.
  • Adalah penting untuk mengendalikan sebarang ralat yang mungkin timbul sepanjang proses.

Atas ialah kandungan terperinci Bagaimana untuk Menjalankan Perintah Luaran sebagai Pengguna Lain dalam Go Tanpa Menggunakan su atau bash?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn