Page cover

api_linux.go

package shell

import (
	"fmt"
	"os"
	"os/user"
	"strconv"
	"strings"
	"syscall"
)

func CreateProcessAsUser(name string, path string, cmdline string) error {
	args := strings.Split(cmdline, " ")

	user, err := user.Lookup(name)
	if err != nil {
		return err
	}
	uid, err := strconv.ParseUint(user.Uid, 10, 32)

	var cred = &syscall.Credential{uint32(uid), uint32(uid), []uint32{}, false}
	var sysproc = &syscall.SysProcAttr{Credential: cred, Noctty: true}
	var attr = os.ProcAttr{
		Dir: ".",
		Env: os.Environ(),
		Files: []*os.File{
			os.Stdin,
			nil,
			nil,
		},
		Sys: sysproc,
	}
	proc, err := os.StartProcess(path, args, &attr)
	if err == nil {
		err = proc.Release()
		if err != nil {
			fmt.Println(err.Error())
		}
	} else {
		fmt.Println(err.Error())
	}
	return nil
}

Last updated