Heim >Backend-Entwicklung >Golang >Wie führe ich externe Befehle als anderer Benutzer in Go aus, ohne su oder bash zu verwenden?

Wie führe ich externe Befehle als anderer Benutzer in Go aus, ohne su oder bash zu verwenden?

Linda Hamilton
Linda HamiltonOriginal
2024-12-24 02:56:10895Durchsuche

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

Externe Befehle als anderer Benutzer mit os/exec ausführen

In Go bietet das Paket os/exec eine Möglichkeit, externe Befehle aus einem Programm auszuführen. Standardmäßig werden Befehle jedoch mit denselben Benutzerrechten wie das Programm selbst ausgeführt.

Befehle als anderer Benutzer ausführen (ohne su/bash)

Um Befehle mit den Rechten eines anderen Benutzers auszuführen Ohne auf die Befehle su oder bash zurückgreifen zu müssen, können Sie syscall.Credential verwenden. Hier ist ein Beispiel:

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

Alternative Methode mit Setuid (nicht empfohlen)

Obwohl dies aufgrund potenzieller Sicherheitsrisiken nicht empfohlen wird, können Sie auch syscall.Setuid verwenden, um die effektive Benutzer-ID von zu ändern die jetzige Prozess.

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

Hinweis:

  • In den obigen Beispielen wird davon ausgegangen, dass der aktuelle Prozess als Root mit den entsprechenden su-Berechtigungen ausgeführt wird.
  • Wenn Sie Umgebungsvariablen an den untergeordneten Prozess übergeben müssen, können Sie diese mit Cmd.Env festlegen.
  • Es ist wichtig, mit allen Variablen umzugehen Fehler, die während des Prozesses auftreten können.

Das obige ist der detaillierte Inhalt vonWie führe ich externe Befehle als anderer Benutzer in Go aus, ohne su oder bash zu verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn