2009-03-05 2 views
1

Ich habe im Internet nach einem Java-Paket/einer Klasse gesucht, die es mir erlaubt, die UNIX/etc/group-Datei zu analysieren. Während es wirklich nicht so schwer wäre, das von Grund auf neu zu schreiben, bin ich ziemlich überrascht, nichts da draußen zu finden. Es gibt eine POSIX passwd-Klasse (siehe http://www.bmsi.com/java/posix/docs/posix.Passwd.html), aber ich finde keine ähnliche Klasse für/etc/group. Gibt es so etwas?Gibt es ein Java-Paket zum Lesen der UNIX/etc/group-Datei?

+0

die Posix API verwenden: https://github.com/jnr/jnr-posix – kervin

Antwort

4

Heres mein Code, dass Tofubeer aktualisiert, dass ich wieder aktualisiert. Sein kompiliert nicht. fehlende InvalidGroupException-Klasse. Außerdem wurde kein Paket angegeben. EMPTY_LIST auf emptyList() geschaltet, um fehlende Parametrierung zu vermeiden.

package fileutils; 

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.Collections; 
import java.util.List; 

public class GroupReader2 { 
    public static class InvalidGroupException extends Exception { 
     private static final long serialVersionUID = 1L; 

     public InvalidGroupException(String string) { 
      super(string); 
     } 
    } 

    public static GroupReader2 parseGroup(final String groupLine) 
      throws InvalidGroupException { 
     final String line; 
     final String[] parts; 

     if (groupLine == null) { 
      throw new IllegalArgumentException("groupLine cannot be null"); 
     } 

     line = groupLine.trim(); 

     if (line.startsWith("#") || line.isEmpty()) { 
      return null; 
     } 

     parts = line.split(":"); 

     if (parts.length < 3) { 
      throw new InvalidGroupException(groupLine 
        + "must be in the format of name:passwd:gid[:userlist]"); 
     } 

     try { 
      final GroupReader2 group; 
      final String name; 
      final String passwd; 
      final int gid; 
      final List<String> userList; 

      name = parts[0]; 
      passwd = parts[1]; 
      gid = Integer.parseInt(parts[2]); 

      if (parts.length == 4) { 
       userList = Arrays.asList(parts[3].split(",")); 
      } else { 
       userList = Collections.emptyList(); 
      } 

      group = new GroupReader2(name, passwd, gid, userList); 

      return group; 
     } catch (final NumberFormatException ex) { 
      throw new InvalidGroupException(groupLine + " gid must be a number"); 
     } 
    } 

    private final int gid; 
    private final String name; 
    private final String passwd; 

    private final List<String> userList; 

    public GroupReader2(final String nm, final String pw, final int id, 
      final List<String> users) { 
     name = nm; 
     passwd = pw; 
     gid = id; 
     userList = Collections.unmodifiableList(new ArrayList<String>(users)); 
    } 

    public int getGid() { 
     return (gid); 
    } 

    public String getName() { 
     return (name); 
    } 

    public String getPasswd() { 
     return (passwd); 
    } 

    public List<String> getUserList() { 
     return (userList); 
    } 

    @Override 
    public String toString() { 
     final StringBuilder sb; 

     sb = new StringBuilder(); 
     sb.append(name); 
     sb.append(":"); 
     sb.append(passwd); 
     sb.append(":"); 
     sb.append(gid); 
     sb.append(":"); 

     for (final String user : userList) { 
      sb.append(user); 
      sb.append(","); 
     } 

     sb.setLength(sb.length() - 1); 

     return (sb.toString()); 
    } 
} 
+0

Schön. Zwei kleinere Nissen: (1) Vektor ist uralt, betrachte stattdessen ArrayList; (2) Setter sind irreführend, da Sie schreibgeschützten Zugriff gewähren. – jdigital

+0

Eine kleine Nit auf Ihrer Nebenstelle, ArrayList sollte nicht der Variablentyp sein, deklarieren Sie die Variable stattdessen als List. Machen Sie die Variablen auch final und die set-Methoden werden nicht kompiliert. – TofuBeer

+0

@jdigital Gute Ideen, die ich bearbeitet habe, um diese Änderungen vorzunehmen. –

0

Java ist maschinenunabhängig, und ich bin nicht überrascht. Die von Ihnen angegebene Klasse ist nicht Standard.

Ich denke, dass der gleiche Grund, der gibt, um die/etc/group-Datei von allen zu verbergen, uns einen Anhaltspunkt geben kann, um den Grund zu verstehen, warum Java es nicht zur Verfügung stellt.

+0

ich sicherlich zustimmen, dass es verständlich ist, dass Java nicht in der Klasse gebaut bietet. Ich war einfach überrascht, dass irgendwo im Internet solch eine Drittklasse nicht existierte. –

2

Falls Sie werden dieses Programm überall außer Ihrer eigenen Maschine laufen zu lassen, das Lesen/etc/group nicht eine gute Idee ist.

Die realen Welt verwendet nist/ldap usw. all diese Informationen zu halten ..

Sie können getpwent/getgrent Familie mit JNI Sie können einige Posix-Implementierung von Java bekommen, die diese Verpackungen wickeln möchten.

Hoffnung, dass ..

+0

Genau die Art von Sache, die ich vorgeschlagen hätte ... schließlich wissen diese C-Bibliotheken bereits, wie man auf die entsprechende Datei zugreift. – Powerlord

4

Hier hilft, ist der Code John Ellinwood zur Verfügung gestellt, aber sicherer gemacht (edit: hinzugefügt Johns ändert, etwas anders, dann mit den Kommentaren synchron zu halten Gut zu sehen, wie zwei Menschen umzusetzen. die gleiche Art von Code).

Ich entschied mich, Ausnahmen im Falle einer ungültigen Zeile zu werfen, Sie könnten einfach null zurückgeben, wie er es ursprünglich tat (ich sehe nicht den Punkt in der Verwendung einer Datei, die falsche Daten hat ...).

Die einzige "muss tun" ändern Wrapping der userList als UnmodifableList (oder eine neue Kopie der Liste) andernfalls könnte ein böswilliger Benutzer dieser Methode Dinge der userList hinzufügen (getUserList aufrufen und dann mit dem Hinzufügen von Elementen fortfahren) dazu oder entfernen Sie Gegenstände daraus).

Da die Gruppenklasse unveränderlich ist (alle Instanzvariablen sind endgültig), besteht keine Gefahr, dass sie von einem Aufrufer geändert werden.

import java.util.Arrays; 
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.List; 

public class Group 
{ 
    private final int gid; 
    private final String name; 
    private final String passwd; 
    private final List<String> userList; 

    public static Group parseGroup(final String groupLine) 
     throws InvalidGroupException 
    { 
     final String line; 
     final String[] parts; 

     if(groupLine == null) 
     { 
      throw new IllegalArgumentException("groupLine cannot be null"); 
     } 

     line = groupLine.trim(); 

     if(line.startsWith("#") || line.isEmpty()) 
     { 
      return null; 
     } 

     parts = line.split(":"); 

     if(parts.length < 3) 
     { 
      throw new InvalidGroupException(groupLine + "must be in the format of name:passwd:gid[:userlist]", line); 
     } 

     try 
     { 
      final Group  group; 
      final String  name; 
      final String  passwd; 
      final int   gid; 
      final List<String> userList; 

      name = parts[0]; 
      passwd = parts[1]; 
      gid = Integer.parseInt(parts[2]); 

      if(parts.length == 4) 
      { 
       userList = Arrays.asList(parts[3].split(",")); 
      } 
      else 
      { 
       userList = Collections.emptyList(); 
      } 

      group = new Group(name, passwd, gid, userList); 

      return group; 
     } 
     catch(final NumberFormatException ex) 
     { 
      throw new InvalidGroupException(groupLine + " gid must be a number", line); 
     } 
    } 

    public Group(final String nm, final String pw, final int id, final List<String> users) 
    { 
     name  = nm; 
     passwd = pw; 
     gid  = id; 
     userList = Collections.unmodifiableList(new ArrayList<String>(users)); 
    } 

    public int getGid() 
    { 
     return (gid); 
    } 

    public String getName() 
    { 
     return (name); 
    } 

    public String getPasswd() 
    { 
     return (passwd); 
    } 

    public List<String> getUserList() 
    { 
     return (userList); 
    } 

    @Override 
    public String toString() 
    { 
     final StringBuilder sb; 

     sb = new StringBuilder(); 
     sb.append(name); 
     sb.append(":"); 
     sb.append(passwd); 
     sb.append(":"); 
     sb.append(gid); 
     sb.append(":"); 

     for(final String user : userList) 
     { 
      sb.append(user); 
      sb.append(","); 
     } 

     sb.setLength(sb.length() - 1); 

     return (sb.toString()); 
    } 
} 

public class InvalidGroupException 
    extends Exception 
{ 
    private static final long serialVersionUID = 1L; 
    private final String line; 

    public InvalidGroupException(final String msg, final String ln) 
    { 
     super(msg); 

     line = ln; 
    } 

    public String getLine() 
    { 
     return (line); 
    } 
} 
+0

Kompiliert nicht. fehlende InvalidGroupException-Klasse. Außerdem wurde kein Paket angegeben. EMPTY_LIST auf emptyList() geschaltet, um fehlende Parametrierung zu vermeiden. –

+0

Paket ist nicht erforderlich (immer eine gute Praxis, aber ich störe mich nicht mit Beispielcode wie folgt). – TofuBeer

Verwandte Themen