如何解决os/user: 在为带有 osusergo 标签的 linux/amd64 构建时出现“GroupIds 需要 cgo”
我正在尝试构建一个静态可执行文件,该可执行文件使用 os/user
模块查找特定用户在 linux/amd64
上所属的组。
根据 documentation,设置 osusergo
构建标记将允许我使用此模块的非 cgo 版本,但该标志似乎没有任何作用。
这是我构建可执行文件的方式:
export CGO_ENABLED=0
export GOOS=linux
export GOARCH=amd64
go build -tags osusergo -o bin/agent
这是我的 Go 版本:
$ go version
go version go1.14.4 linux/amd64
以下是我如何使用 os/user
模块的示例:
import (
"os/user"
)
func GetUserGroupIds(uid string) ([]string,error) {
u,err := user.LookupId(uid)
if err != nil {
return nil,err
}
gids,err := u.GroupIds()
if err != nil {
return nil,err
}
return gids,nil
}
在查找特定用户所属的组时,我收到以下错误:user: GroupIds requires cgo
。
我是否没有正确使用 -tags osusergo
?
解决方法
阅读源代码后,发现 listGroups(u *User)
模块的 os/user
函数没有本地 Go 实现:
// Copyright 2016 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// +build dragonfly darwin freebsd !android,linux netbsd openbsd
// +build cgo,!osusergo
package user
import (
"fmt"
"strconv"
"unsafe"
)
/*
#include <unistd.h>
#include <sys/types.h>
*/
import "C"
const maxGroups = 2048
func listGroups(u *User) ([]string,error) {
ug,err := strconv.Atoi(u.Gid)
if err != nil {
return nil,fmt.Errorf("user: list groups for %s: invalid gid %q",u.Username,u.Gid)
}
userGID := C.gid_t(ug)
nameC := make([]byte,len(u.Username)+1)
copy(nameC,u.Username)
n := C.int(256)
gidsC := make([]C.gid_t,n)
rv := getGroupList((*C.char)(unsafe.Pointer(&nameC[0])),userGID,&gidsC[0],&n)
if rv == -1 {
// Mac is the only Unix that does not set n properly when rv == -1,so
// we need to use different logic for Mac vs. the other OS's.
if err := groupRetry(u.Username,nameC,&gidsC,&n); err != nil {
return nil,err
}
}
gidsC = gidsC[:n]
gids := make([]string,n)
for _,g := range gidsC[:n] {
gids = append(gids,strconv.Itoa(int(g)))
}
return gids,nil
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。