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
Lepaskan: 2024-12-24 02:56:10
asal
946 orang telah melayarinya

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()
}
Salin selepas log masuk

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)
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan