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