使用Java检查Linux用户的组成员身份

使用Java检查Linux用户的组成员身份,java,linux,usergroups,Java,Linux,Usergroups,嗨,我不知道如何使用Java7NIO库验证一个用户是否属于Linux操作系统下的一个或多个组 有人能帮我解决这个问题吗?你可以尝试阅读文件/etc/group 我开发了一个类来轻松查询此文件: public class UserInfo { public UserInfo() throws FileNotFoundException, IOException { this.group2users = new HashMap<>(); Fil

嗨,我不知道如何使用Java7NIO库验证一个用户是否属于Linux操作系统下的一个或多个组


有人能帮我解决这个问题吗?

你可以尝试阅读文件
/etc/group

我开发了一个类来轻松查询此文件:

public class UserInfo {

    public UserInfo() throws FileNotFoundException, IOException {
        this.group2users = new HashMap<>();

        FileReader fileReader = new FileReader(groupsFilePath);
        BufferedReader groupsReader = new BufferedReader(fileReader);
        while(groupsReader.ready())
        {
            try
            {
                String line = groupsReader.readLine();
                String [] tokens = line.split(":");
                String groupName = tokens[0];
                Set<String> users = group2users.get(groupName);
                if(users == null)
                {
                    users = new HashSet<String>();
                    group2users.put(groupName, users);
                }
                if(tokens.length>3)
                {
                    for(String uStr: tokens[3].split(","))
                        users.add(uStr);
                }
            } catch (Exception e) { continue; }
        }
        groupsReader.close();
        fileReader.close();
    }

    public boolean belongs2group(String user, String group)
    {
        Set<String> groupRef = group2users.get(group);
        if(groupRef == null) return false;
        return groupRef.contains(user);
    }

    private String groupsFilePath = "/etc/group";
    private Map<String, Set<String>> group2users;

}
公共类用户信息{
public UserInfo()抛出FileNotFoundException,IOException{
this.group2users=newhashmap();
FileReader FileReader=新的FileReader(groupsFilePath);
BufferedReader groupsReader=新的BufferedReader(文件阅读器);
while(groupsReader.ready())
{
尝试
{
String line=groupsReader.readLine();
String[]tokens=line.split(“:”);
字符串groupName=tokens[0];
Set users=group2users.get(groupName);
如果(用户==null)
{
users=newhashset();
group2users.put(groupName,users);
}
如果(令牌长度>3)
{
对于(字符串uStr:tokens[3]。拆分(“,”)
用户。添加(uStr);
}
}catch(异常e){continue;}
}
groupsReader.close();
fileReader.close();
}
公共布尔值belongs2group(字符串用户,字符串组)
{
设置groupRef=group2users.get(组);
if(groupRef==null)返回false;
返回groupRef.contains(用户);
}
私有字符串groupsFilePath=“/etc/group”;
私人地图用户;
}
此代码映射
/etc/group
文件,并保留用户设置的组映射。 我只开发了一种查询方法(
belongs2group
),但添加方法以列出所有组和/或所有用户相当容易


这段代码是使用老式的主流javaioapi编写的,但我认为它可以很容易地适应nio。如果您需要我完成该步骤,请告诉我。

我不认为阅读本地
/etc/passwd
/etc/group
可能是个好主意,因为nis/ldap/ipa/pam可以介绍有关组成员资格的其他信息源。 所以,这取决于您的环境和其他一些细节。例如:

登录(当前)用户的组

  com.sun.security.auth.module.UnixSystem().getGroups()
Hadoop

  org.apache.hadoop.security.UserGroupInformation.getBestUGI(null,"root").getGroupNames()
如果两者都不是你的情况

您可以为创建jna包装器

或者改进并从jdk获取用户id/name参数


或者重写
org.apache.hadoop.security.GroupMappingServiceProvider接口的一些实现,使其不依赖于hadoop环境。

将其与。我不认为仅仅用Java代码就可以做到这一点。运行程序的用户是否拥有对
/etc/group
的读取权限?@PabloFranciscoPérezHidalgo
/etc/group
通常是世界可读的。您的两个选项基本上是调用
groups
命令(目前为止最简单)或者将JNA包装在POSIX或PAM调用中。NIO与之有什么关系?Tnx非常感谢您的回答,我尝试将其转换为NIO lib并给您反馈。/etc/group不是有关组成员身份信息的唯一来源。请不要忘记nis/ldap/pam。