我有一个简单的代码,基本上像这样:
package main
import (
"fmt"
"golang.org/x/sys/unix"
)
func main() {
fmt.Printf("real: %d, effective: %d\n", unix.Getuid(), unix.Geteuid())
}
基本上输出真实有效的用户ID。现在,使用以下命令构建:
go build main.go
;我还调用sudo chown root:root main && sudo chmod 4755 main
以获取文件的-rwsr-xr-x
权限。如果我了解setuid位(
s
部分)的概念,它允许我稍后在源文件中使用setuid(请注意,我必须将unix.Setreuid
或unix.RawSyscall
与runtime.LockOSThread
结合使用)。但是,无论什么总是返回real: 1000, effective: 1000
,当前编译的代码。起初我以为某些Go代码可能就是这种情况,经过两次和三重检查后发现,结果仍然相同。然后我走得更远,并在c中进行了模拟:
int main(int argc, char* argv){
printf("real: %d, effective: %d\n", getuid(), geteuid());
fflush(stdout);
}
编译,chown'ed为
root:root
,chmod'ed为4755
,你猜怎么着?它仍然做同样的事情,它输出real: 1000, effective: 1000
。因此,如果两个版本均已编译:Go和C版本,在权限方面进行了适当的更改,则返回相同的结果:忽略设置,否则可能会对系统设置执行某些操作。
更新[0]:我已经知道这种情况可能是由已安装驱动器的
nosuid
选项引起的。因此,我已将可执行文件复制到另一个没有此选项的驱动器。仍然没有效果。所以我该怎么做:
期待看到您的建议。
最佳答案
对nosuid
选项的更深入研究表明,包括编译在内的整个过程必须在安装了的驱动器上进行,而无需使用 nosuid
选项。
因此,基本上来说,解决此问题的步骤是:
nosuid
的驱动器上创建目录; w
选项; go build
; chown root:root
应用于结果; chmod 4755
应用于结果; 并且要检测环境,您需要在安装过程中搜索不带
nosuid
参数的目标。关于linux - getuid/geteuid奇怪的行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50946246/