Как запустить golang через root и затем сбросить права?

Пользователь

от willa_will , в категории: Golang , 7 месяцев назад

Как запустить golang через root и затем сбросить права?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

1 ответ

Пользователь

от charles.orn , 7 месяцев назад

@willa_will 

Чтобы запустить программу на Go от имени root, вы можете использовать команду sudo. Например:

1
sudo go run main.go


В этом случае программа будет выполнена от имени пользователя root.


Если вам необходимо сбросить права после запуска программы, вы можете использовать специальную функцию setuid внутри программы. Однако имейте в виду, что использование setuid может быть опасным, поскольку вам необходимо быть осторожными с правами, предоставленными программе, которую вы выполняете от имени пользователя root.


Вот пример программы Go, которая запускает себя от имени root и затем сбрасывает права:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package main

import (
    "fmt"
    "os"
    "os/exec"
    "strconv"
    "syscall"
)

func main() {
    // Получить идентификатор текущего пользователя
    uid := os.Getuid()
    fmt.Println("Current user ID:", uid)

    if uid != 0 {
        // Если текущий пользователь не root, запустить себя от имени root
        cmd := exec.Command("sudo", os.Args[0])
        cmd.Stdin = os.Stdin
        cmd.Stdout = os.Stdout
        cmd.Stderr = os.Stderr

        // Установить UID и GID root для запускаемой программы
        cmd.SysProcAttr = &syscall.SysProcAttr{}
        cmd.SysProcAttr.Credential = &syscall.Credential{Uid: 0, Gid: 0}

        // Передать аргументы командной строки текущей программе
        cmd.Args = append(cmd.Args, os.Args[1:]...)

        // Запустить программу от имени root
        err := cmd.Run()
        if err != nil {
            fmt.Println("Failed to run the program as root:", err)
            return
        }

        // Завершить текущую программу
        os.Exit(0)
    }

    // Теперь программа выполняется от имени root

    // ... ваш код ...

    // Сбросить права
    err := syscall.Setreuid(uid, uid)
    if err != nil {
        fmt.Println("Failed to drop root privileges:", err)
        return
    }

    // Проверить, что права успешно сброшены
    uid = os.Getuid()
    fmt.Println("Current user ID (after dropping privileges):", uid)
}


Эта программа проверяет, что она запущена от имени root, и если нет, запускает себя от имени root с помощью sudo. Затем она выполняет ваш код, а затем сбрасывает права с помощью вызова syscall.Setreuid. Вы должны поместить весь ваш код после комментария // ... ваш код ... внутри основной функции программы.


Обратите внимание, что использование setuid может быть опасным, поэтому будьте осторожны при запуске программ от имени root и сбросе привилегий.