setuid:不支持操作

setuid: operation not supported

package main

import (
        "log"
        "syscall"
)

func main() {
        setuidErr := syscall.Setuid(0)
        if setuidErr != nil {
                log.Fatal(setuidErr)
        }
}

当我 运行 以上代码时,出现以下错误:

operation not supported
exit status 1

go 版本:1.15.5

谁能帮帮我?

这里引用官方文档

On Linux Setuid and Setgid only affects the current thread, not the process. This does not match what most callers expect so we must return an error here rather than letting the caller think that the call succeeded.

一个可能的解决方案是commit

syscall.Setuid() 在 Linux 上的 go 1.16 中得到修复。您可以通过以下方式下载go 1.16:

$ go get golang.org/dl/go1.16
$ ~/go/bin/go1.16 download

尝试编译:

$ ~/go/bin/go1.16 build prog.go

您将收到一个不同的错误:“不允许操作”。这是防止微不足道的特权升级的内核...

您想做以下其中一项:

$ sudo /sbin/setcap cap_setuid=ep ./prog

或者,

$ sudo chown root ./prog
$ sudo chmod +s ./prog

现在,当您 运行 命令时,它不会记录错误:

$ ./prog
$ echo $?
0