setuid:不支持操作


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

当我运行上面的代码时,我得到以下错误:

不支持操作
退出状态1

go版本:1.15.5

有人能帮我吗?

这是官方文档中的一句话

在Linux上,Setuid和Setgid只影响当前线程,而不影响过程这与大多数呼叫者的预期不符,因此我们必须在此处返回一个错误,而不是让调用者认为调用成功。

一个可能的解决方案是在这个提交中

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

最新更新